我研究了kill
,pkill
和killall
命令,我理解了它们的大部分区别。但是,我对他们的信号感到困惑:
如果我运行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
但是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).
即使没有信号列表,此命令也支持/使用信号,只需在前面出现的输出中查看
-<sig>, --signal <sig> signal to send (either number or name)
最后,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
问题
- 为什么 和 的信号列表不
kill
一样?killall
pkill
我假设pkill
并且killall
应该显示相同的输出kill -l
- 乍一看,它似乎pkill
不支持信号。
环境:
对于 Ubuntu Server 18:04、20:04 和 Fedora Workstation 36,我遇到了这种情况
很可能是因为它们在不同的时间、不同的人以不同的方式实施。
您应该注意,所有命令都有某种形式的
--signal
参数,可以指定内核能够发送的任何信号,无论内联帮助或手册页可能手动写入其中的信号。与往常一样,请查阅命令的文档(通常在手册中提供man command
)以获取有关其用法、调用和选项的详细信息。您还可以查看手册的第 7 节以了解详细信息 - 例如,请参阅终止信号列表。你提到的程序(
kill
和killall
)pkill
很有可能有不同的作者。并且每个作者决定如何为用户提供帮助。你不能指望他们会有相同的命令行,相同的选项。你应该记住一些人(包括我)阅读他们现在工作的操作系统上的手册页以避免输入错误的命令:)。
killall
阅读Linux、Solaris 和 AIX的手册页,您会感到惊讶该
kill
程序和killall
显示相同的一组信号:kill
它本身就是内置的外壳。pkill
只是显示没有信号列表。kill
内置显示相同的信号,直到信号 31,但 29 除外,它显示或SIGIO
,SIGPOLL
它们是彼此的同义词。高于 31 的信号是实时信号,然后它们中的一些被标记为线程,但它们是“不同的”并且通常比低于 31 的信号更少使用。