为什么kill、killall和pkill的信号列表不一样?

Man*_*dan 4 linux kill signals options pkill

我研究了killpkillkillall命令,并且了解了它们的大部分差异。然而,我对他们的信号感到困惑:

如果我运行kill -l,我会看到:

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
Run Code Online (Sandbox Code Playgroud)

pkill -l给出:

pkill: invalid option -- 'l'

Usage:
 pkill [options] <pattern>

Options:
 -<sig>, --signal <sig>    signal to send (either number or name)
 -e, --echo                display what is killed
 -c, --count               count of matching processes
 -f, --full                use full process name to match
 -g, --pgroup <PGID,...>   match listed process group IDs
 -G, --group <GID,...>     match real group IDs
 -i, --ignore-case         match case insensitively
 -n, --newest              select most recently started
 -o, --oldest              select least recently started
 -P, --parent <PPID,...>   match only child processes of the given parent
 -s, --session <SID,...>   match session IDs
 -t, --terminal <tty,...>  match by controlling terminal
 -u, --euid <ID,...>       match by effective IDs
 -U, --uid <ID,...>        match by real IDs
 -x, --exact               match exactly with the command name
 -F, --pidfile <file>      read PIDs from file
 -L, --logpidfile          fail if PID file is not locked
 --ns <PID>                match the processes that belong to the same
                           namespace as <pid>
 --nslist <ns,...>         list which namespaces will be considered for
                           the --ns option.
                           Available namespaces: ipc, mnt, net, pid, user, uts

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see pgrep(1).
Run Code Online (Sandbox Code Playgroud)

即使没有信号列表,该命令也支持/使用信号,只需查看前面出现的输出

-<sig>, --signal <sig>    signal to send (either number or name)
Run Code Online (Sandbox Code Playgroud)

最后,killall -l返回:

HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT
CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS
Run Code Online (Sandbox Code Playgroud)

问题

  • 为什么、的信号列表不同?killkillallpkill

我假设pkill并且killall应该显示相同的输出kill -l- 乍一看,似乎pkill不支持信号。

环境:

我在 Ubuntu Server 18:04、20:04 和 Fedora Workstation 36 上遇到这种情况

Dop*_*oti 13

\n

为什么kill、killall和pkill的信号列表不一样?

\n
\n

最有可能的是,因为它们是由不同的人在不同的时间以不同的心态以不同的方式实施的。

\n

您应该注意,所有命令都有某种形式的--signal参数,可以指定内核能够发送的任何信号,无论内联帮助或手册页可能已手动写入其中的信号。与往常一样,请查阅命令的文档(通常可在手册中找到man command)以获取有关其用法、调用和选项的详细信息。您还可以查看手册的 \xc2\xa77 了解详细信息 -例如,请参阅“杀死信号列表” 。

\n

  • @ManuelJordan 每个信号都有一个名称和一个编号。在幕后,kill 命令必须进行的系统调用只接受数字。所有的kill命令都有一个将信号指定为数字的选项,这几乎肯定会不加改变地通过。它们还都可以选择按名称指定(并将名称转换为数字),并且可能将相同的名称分配给相同的数字(特别是对于 POSIX 规范定义的广泛使用的名称),但某些命令似乎是合理的它们对不常见信号的支持会有所不同。 (6认同)

Rom*_*nov 9

您提到的程序(killkillallpkill)很可能有不同的作者。每个作者决定如何向用户提供帮助。你不能指望他们会有相同的命令行、相同的选项。

您应该记住,有些人(包括我)会阅读他们现在使用的操作系统的手册页,以避免输入错误的命令:)。阅读 Linux、Solaris 和 AIX 的手册页killall,您将会感到惊讶