向进程发送信号
命令语法格式
kill [-signal|-s signal|-p] [-q value] [-a] [–] pid|name…
kill -l [number] | -L
命令描述
命令kill将指定的信号发送到指定的进程或进程组。
如果未指定信号,则发送TERM信号。 此信号的默认操作是终止该过程。 该信号应该优先于KILL信号(编号9)使用,因为进程可以安装TERM信号的处理程序,以便在以有序方式终止之前执行清理步骤。 如果在发送TERM信号之后进程没有终止,则可以使用KILL信号;请注意,后一个信号无法捕获,因此不会使目标进程有机会在终止之前执行任何清理动作。
如果signal为0,则不发送实际信号,但仍执行错误检查。
命令支持的选项及含义
进程列表取值
pid
每个pid可以是以下四种之一:
0,发信号通知当前进程组中的所有进程。
-1,向PID大于1的所有进程发送信号。
-n,其中n>1。向进程组n中的所有进程发送信号。当给出形式为’-n’的参数,并且它意味着表示一个进程组时,则必须首先指定一个信号,或者必须在参数之前加上’–‘选项,否则kill会将n视为信号。
name
将使用此名称调用的所有进程都将发出信号。
命令可用选项
-s, –signal signal
指定要发送的信号。可以是数字或者信号名。
-l, –list [number]
打印信号名称列表,或将给定的信号编号number转换为名称。 信号可以在/usr/include/linux/signal.h中找到。
-L, –table
与-l类似,但它将打印信号名称及其相应的数字。
-a, –all
不要将“命令名到PID”的转换限制为与当前进程具有相同UID的进程。
-p, –pid
仅打印指定名称的进程的PID,不发送任何信号。
–verbose
打印PID,这些进程将被发送与kill一起的信号。
-q, –queue value
使用sigqueue(3)而不是kill(2)。 参数value是一个与信号一起发送的整数。 如果接收进程使用SA_SIGINFO标志为sigaction(2)安装了此信号的处理程序,则它可以通过siginfo_t结构的si_sigval字段获取此数据。
注意事项
大多数现代Shell都有一个内置的kill命令,其用法与此处描述的命令非常相似。选项–all,–pid,–queue以及通过命令名指定进程的可能性是本地扩展。
尽管可以将多线程进程中的一个线程的TID(线程ID,参见gettid(2))指定为kill的参数,但是信号仍然指向进程(即整个线程组)。 换句话说,不可能在多线程进程中向明确选择的线程发送信号。 信号将被传递到目标进程中任意选择的线程,该线程不会阻塞信号。 有关更多详细信息,请参阅signal(7)和clone(2)中CLONE_THREAD的说明。
退出状态
0 成功;
1 失败;
64 部分成功(当指定了多个进程时);
使用示例
结束所有可以结束的进程:
获取数值为11的信号名:
在表中列出所有可用的信号:
向指定的进程中发送默认信号(SIGTERM):
如上示例。
相关手册
bash(1), tcsh(1), sigaction(2), kill(2), sigqueue(3), signal(7)
参考文献
更新日志
- 07/11/2018 创建文章