systemctl,loginctl,machinectl: add --signal=list

This lists numerical signal values:
$ systemctl --signal list
SIGNAL NAME
1      SIGHUP
2      SIGINT
3      SIGQUIT
...
62     SIGRTMIN+28
63     SIGRTMIN+29
64     SIGRTMIN+30

This is useful when trying to kill e.g. systemd with a specific signal number
using kill. kill doesn't accept our fancy signal names like RTMIN+4, so one
would have to calculate that value somehow. Doing
  systemctl --signal list | grep -F RTMIN+4
is a nice way of doing that.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2021-02-13 16:03:03 +01:00
parent 86beb21302
commit 97ab9dfc0d
3 changed files with 35 additions and 8 deletions

View file

@ -334,13 +334,14 @@
<term><option>-s</option></term>
<term><option>--signal=</option></term>
<listitem><para>When used with <command>kill-session</command>
or <command>kill-user</command>, choose which signal to send
to selected processes. Must be one of the well known signal
specifiers, such as <constant>SIGTERM</constant>,
<constant>SIGINT</constant> or <constant>SIGSTOP</constant>.
If omitted, defaults to
<constant>SIGTERM</constant>.</para></listitem>
<listitem><para>When used with <command>kill-session</command> or <command>kill-user</command>,
choose which signal to send to selected processes. Must be one of the well known signal specifiers,
such as <constant>SIGTERM</constant>, <constant>SIGINT</constant> or <constant>SIGSTOP</constant>.
If omitted, defaults to <constant>SIGTERM</constant>.</para>
<para>The special value <literal>help</literal> will list the known values and the program will exit
immediately, and the special value <literal>list</literal> will list known values along with the
numerical signal numbers and the program will exit immediately.</para></listitem>
</varlistentry>
<varlistentry>

View file

@ -73,7 +73,8 @@
<option>SIGTERM</option>.</para>
<para>The special value <literal>help</literal> will list the known values and the program will exit
immediately.</para>
immediately, and the special value <literal>list</literal> will list known values along with the
numerical signal numbers and the program will exit immediately.</para>
</listitem>
</varlistentry>
</variablelist>

View file

@ -1,7 +1,9 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include "format-table.h"
#include "parse-argument.h"
#include "signal-util.h"
#include "stdio-util.h"
#include "string-table.h"
#include "string-util.h"
@ -16,6 +18,29 @@ int parse_signal_argument(const char *s, int *ret) {
return 0;
}
if (streq(s, "list")) {
_cleanup_(table_unrefp) Table *table = NULL;
table = table_new("signal", "name");
if (!table)
return log_oom();
for (int i = 1; i < _NSIG; i++) {
r = table_add_many(
table,
TABLE_INT, i,
TABLE_SIGNAL, i);
if (r < 0)
return table_log_add_error(r);
}
r = table_print(table, NULL);
if (r < 0)
return table_log_print_error(r);
return 0;
}
r = signal_from_string(s);
if (r < 0)
return log_error_errno(r, "Failed to parse signal string \"%s\".", s);