1
0
mirror of https://github.com/systemd/systemd.git synced 2025-02-02 13:47:27 +03:00

systemctl: is-failed: check if system is degraded when no unit given

Closes #3335
This commit is contained in:
Mike Yuan 2023-10-17 20:47:54 +08:00
parent def1e20a18
commit 2ee346160c
No known key found for this signature in database
GPG Key ID: 417471C0A40F58B3
4 changed files with 35 additions and 10 deletions

View File

@ -219,15 +219,14 @@ Sun 2017-02-26 20:57:49 EST 2h 3min left Sun 2017-02-26 11:56:36 EST 6h ago
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><command>is-failed <replaceable>PATTERN</replaceable></command></term> <term><command>is-failed <optional><replaceable>PATTERN</replaceable></optional></command></term>
<listitem> <listitem>
<para>Check whether any of the specified units are in a <para>Check whether any of the specified units is in the "failed" state. If no unit is specified,
"failed" state. Returns an exit code check whether there are any failed units, which corresponds to the <literal>degraded</literal> state
<constant>0</constant> if at least one has failed, returned by <command>is-system-running</command>. Returns an exit code <constant>0</constant>
non-zero otherwise. Unless <option>--quiet</option> is if at least one has failed, non-zero otherwise. Unless <option>--quiet</option> is specified, this
specified, this will also print the current unit state to will also print the current unit or system state to standard output.</para>
standard output.</para>
<xi:include href="version-info.xml" xpointer="v197"/> <xi:include href="version-info.xml" xpointer="v197"/>
</listitem> </listitem>

View File

@ -69,5 +69,28 @@ int verb_is_failed(int argc, char *argv[], void *userdata) {
UNIT_FAILED, UNIT_FAILED,
}; };
int r;
if (argc > 1)
return check_unit_generic(EXIT_PROGRAM_DEAD_AND_PID_EXISTS, states, ELEMENTSOF(states), strv_skip(argv, 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;
} }

View File

@ -162,7 +162,8 @@ static int systemctl_help(void) {
" list-timers [PATTERN...] List timer units currently in memory,\n" " list-timers [PATTERN...] List timer units currently in memory,\n"
" ordered by next elapse\n" " ordered by next elapse\n"
" is-active PATTERN... Check whether units are active\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" " status [PATTERN...|PID...] Show runtime status of one or more units\n"
" show [PATTERN...|JOB...] Show properties of one or more\n" " show [PATTERN...|JOB...] Show properties of one or more\n"
" units/jobs or the manager\n" " units/jobs or the manager\n"
@ -1165,7 +1166,7 @@ static int systemctl_main(int argc, char *argv[]) {
{ "thaw", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_clean_or_freeze }, { "thaw", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_clean_or_freeze },
{ "is-active", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_is_active }, { "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 */ { "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 }, { "show", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_show },
{ "cat", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_cat }, { "cat", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_cat },
{ "status", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_show }, { "status", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_show },

View File

@ -135,6 +135,8 @@ systemctl restart "$UNIT_NAME"
systemctl stop "$UNIT_NAME" systemctl stop "$UNIT_NAME"
(! systemctl is-active "$UNIT_NAME") (! systemctl is-active "$UNIT_NAME")
assert_eq "$(systemctl is-system-running)" "$(systemctl is-failed)"
# enable/disable/preset # enable/disable/preset
test_enable_disable_preset() { test_enable_disable_preset() {
(! systemctl is-enabled "$@" "$UNIT_NAME") (! systemctl is-enabled "$@" "$UNIT_NAME")