systemctl: make show/status honour --state and --type

This makes the interface more flexible, by allowing the same filtering
for show and status as is done for list-units.

Fixes #23207.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2022-05-26 10:37:35 +09:00
committed by Yu Watanabe
parent c7a0c74c7f
commit a6e334649d
2 changed files with 42 additions and 34 deletions
+21 -25
View File
@@ -188,13 +188,15 @@ Sun 2017-02-26 20:57:49 EST 2h 3min left Sun 2017-02-26 11:56:36 EST 6h ago
<term><command>status</command> <optional><replaceable>PATTERN</replaceable>…|<replaceable>PID</replaceable>…]</optional></term>
<listitem>
<para>Show terse runtime status information about one or
more units, followed by most recent log data from the
journal. If no units are specified, show system status. If
combined with <option>--all</option>, also show the status of
all units (subject to limitations specified with
<option>-t</option>). If a PID is passed, show information
about the unit the process belongs to.</para>
<para>Show runtime status information about the whole system or about one or more units followed
by most recent log data from the journal. If no positional arguments are specified, and no unit
filter is given with <option>--type=</option>, <option>--state=</option>, or
<option>--failed</option>, shows the status of the whole system. If combined with
<option>--all</option>, follows that with the status of all units. If positional arguments are
specified, each positional argument is treated as either a unit name to show, or a glob pattern
to show units whose names match that pattern, or a PID to show the unit containing that PID. When
<option>--type=</option>, <option>--state=</option>, or <option>--failed</option> are used, units
are additionally filtered by the TYPE and ACTIVE state.</para>
<para>This function is intended to generate human-readable
output. If you are looking for computer-parsable output,
@@ -1621,18 +1623,13 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
<term><option>--type=</option></term>
<listitem>
<para>The argument should be a comma-separated list of unit
types such as <option>service</option> and
<option>socket</option>.
</para>
<para>The argument is a comma-separated list of unit types such as <option>service</option> and
<option>socket</option>. When units are listed with <command>list-units</command>,
<command>show</command>, or <command>status</command>, only units of the specified types will be
shown. By default, units of all types are shown.</para>
<para>If one of the arguments is a unit type, when listing
units, limit display to certain unit types. Otherwise, units
of all types will be shown.</para>
<para>As a special case, if one of the arguments is
<option>help</option>, a list of allowed values will be
printed and the program will exit.</para>
<para>As a special case, if one of the arguments is <option>help</option>, a list of allowed values
will be printed and the program will exit.</para>
</listitem>
</varlistentry>
@@ -1640,14 +1637,13 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
<term><option>--state=</option></term>
<listitem>
<para>The argument should be a comma-separated list of unit
LOAD, SUB, or ACTIVE states. When listing units, show only
those in the specified states. Use <option>--state=failed</option>
to show only failed units.</para>
<para>The argument is a comma-separated list of unit LOAD, SUB, or ACTIVE states. When listing
units with <command>list-units</command>, <command>show</command>, or <command>status</command>,
show only those in the specified states. Use <option>--state=failed</option> or
<option>--failed</option> to show only failed units.</para>
<para>As a special case, if one of the arguments is
<option>help</option>, a list of allowed values will be
printed and the program will exit.</para>
<para>As a special case, if one of the arguments is <option>help</option>, a list of allowed values
will be printed and the program will exit.</para>
</listitem>
</varlistentry>
+21 -9
View File
@@ -2070,6 +2070,7 @@ static int get_unit_dbus_path_by_pid(
static int show_all(
sd_bus *bus,
SystemctlShowMode show_mode,
bool *new_line,
bool *ellipsized) {
@@ -2095,7 +2096,7 @@ static int show_all(
if (!p)
return log_oom();
r = show_one(bus, p, u->id, SYSTEMCTL_SHOW_STATUS, new_line, ellipsized);
r = show_one(bus, p, u->id, show_mode, new_line, ellipsized);
if (r < 0)
return r;
if (r > 0 && ret == 0)
@@ -2196,17 +2197,28 @@ int verb_show(int argc, char *argv[], void *userdata) {
pager_open(arg_pager_flags);
/* If no argument is specified inspect the manager itself */
if (show_mode == SYSTEMCTL_SHOW_PROPERTIES && argc <= 1)
return show_one(bus, "/org/freedesktop/systemd1", NULL, show_mode, &new_line, &ellipsized);
if (argc <= 1) {
/* If no argument or filter is specified inspect the manager itself:
* systemctl status → we show status of the manager
* systemctl status --all → status of the manager + status of all units
* systemctl status --state=… → status of units in listed states
* systemctl status --type=… → status of units of listed types
* systemctl status --failed → status of failed units, mirroring systemctl list-units --failed
*/
if (show_mode == SYSTEMCTL_SHOW_STATUS && argc <= 1) {
if (!arg_states && !arg_types) {
if (show_mode == SYSTEMCTL_SHOW_PROPERTIES)
r = show_one(bus, "/org/freedesktop/systemd1", NULL, show_mode, &new_line, &ellipsized);
else
r = show_system_status(bus);
if (r < 0)
return r;
show_system_status(bus);
new_line = true;
new_line = true;
}
if (arg_all)
ret = show_all(bus, &new_line, &ellipsized);
if (arg_all || arg_states || arg_types)
ret = show_all(bus, show_mode, &new_line, &ellipsized);
} else {
_cleanup_free_ char **patterns = NULL;