</varlistentry>
<varlistentry>
- <term><command>is-failed <replaceable>PATTERN</replaceable>…</command></term>
+ <term><command>is-failed <optional><replaceable>PATTERN</replaceable>…</optional></command></term>
<listitem>
- <para>Check whether any of the specified units are in a
- "failed" state. Returns an exit code
- <constant>0</constant> if at least one has failed,
- non-zero otherwise. Unless <option>--quiet</option> is
- specified, this will also print the current unit state to
- standard output.</para>
+ <para>Check whether any of the specified units is in the "failed" state. If no unit is specified,
+ check whether there are any failed units, which corresponds to the <literal>degraded</literal> state
+ returned by <command>is-system-running</command>. Returns an exit code <constant>0</constant>
+ if at least one has failed, non-zero otherwise. Unless <option>--quiet</option> is specified, this
+ will also print the current unit or system state to standard output.</para>
<xi:include href="version-info.xml" xpointer="v197"/>
</listitem>
UNIT_FAILED,
};
- return check_unit_generic(EXIT_PROGRAM_DEAD_AND_PID_EXISTS, states, ELEMENTSOF(states), strv_skip(argv, 1));
+ int r;
+
+ if (argc > 1)
+ return check_unit_generic(EXIT_PROGRAM_DEAD_AND_PID_EXISTS, states, ELEMENTSOF(states), strv_skip(argv, 1));
+
+ /* If no unit is provided, we check SystemState property of the manager, i.e. whether there're failed
+ * units. */
+
+ _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+ _cleanup_free_ char *state = NULL;
+ sd_bus *bus;
+
+ r = acquire_bus(BUS_MANAGER, &bus);
+ if (r < 0)
+ return r;
+
+ r = bus_get_property_string(bus, bus_systemd_mgr, "SystemState", &error, &state);
+ if (r < 0)
+ return log_error_errno(r, "Failed to query system state: %s", bus_error_message(&error, r));
+
+ if (!arg_quiet)
+ puts(state);
+
+ return streq(state, "degraded") ? EXIT_SUCCESS : EXIT_FAILURE;
}
" list-timers [PATTERN...] List timer units currently in memory,\n"
" ordered by next elapse\n"
" is-active PATTERN... Check whether units are active\n"
- " is-failed PATTERN... Check whether units are failed\n"
+ " is-failed [PATTERN...] Check whether units are failed or\n"
+ " system is in degraded state\n"
" status [PATTERN...|PID...] Show runtime status of one or more units\n"
" show [PATTERN...|JOB...] Show properties of one or more\n"
" units/jobs or the manager\n"
{ "thaw", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_clean_or_freeze },
{ "is-active", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_is_active },
{ "check", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_is_active }, /* deprecated alias of is-active */
- { "is-failed", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_is_failed },
+ { "is-failed", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_is_failed },
{ "show", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_show },
{ "cat", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_cat },
{ "status", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_show },
systemctl stop "$UNIT_NAME"
(! systemctl is-active "$UNIT_NAME")
+assert_eq "$(systemctl is-system-running)" "$(systemctl is-failed)"
+
# enable/disable/preset
test_enable_disable_preset() {
(! systemctl is-enabled "$@" "$UNIT_NAME")