Bash 手册页:kill <pid> 与 kill -9 <pid>

six*_*ude 25 unix bash kill manpages

我的手册页没有记录两者之间的区别

kill <pid>
Run Code Online (Sandbox Code Playgroud)

kill -9 <pid>
Run Code Online (Sandbox Code Playgroud)

既然这些做了不同的事情,为什么 -9 没有记录在kill联机帮助页中? 我想也许这是一个特定于 shell 的东西,所以我也查看了 bash 手册页,但没有运气。

额外问题: -9 有什么作用?

Mar*_*Pim 40

kill只是向给定进程发送信号。该-9告诉它哪些信号发送。

不同的数字对应不同的公共信号。SIGINT,例如,是 2,所以要发送一个进程SIGINT信号发出命令

$ kill -2 <pid>
Run Code Online (Sandbox Code Playgroud)

此处联机帮助页指定:

kill 的默认信号是 TERM。

联机帮助页还提供了您可以发送的信号表。根据这个表,TERMis 15,所以这些都是等价的:

kill <pid>
kill -15 <pid>
kill -TERM <pid>
Run Code Online (Sandbox Code Playgroud)

注意 9 是KILL信号。

   Name   Number  Action
   -----------------------
   ALRM      14   exit
   HUP        1   exit
   INT        2   exit
   KILL       9   exit  this signal may not be blocked
   PIPE      13   exit
   POLL           exit
   PROF           exit
   TERM      15   exit     [Default]
   USR1           exit
   USR2           exit
   VTALRM         exit
   STKFLT         exit  may not be implemented
   PWR            ignore    may exit on some systems
   WINCH          ignore
   CHLD           ignore
   URG            ignore
   TSTP           stop  may interact with the shell
   TTIN           stop  may interact with the shell
   TTOU           stop  may interact with the shell
   STOP           stop  this signal may not be blocked
   CONT           restart   continue if stopped, otherwise ignore
   ABRT       6   core
   FPE        8   core
   ILL        4   core
   QUIT       3   core
   SEGV      11   core
   TRAP       5   core
   SYS            core  may not be implemented
   EMT            core  may not be implemented
   BUS            core  core dump may fail

   XCPU           core  core dump may fail
   XFSZ           core  core dump may fail
Run Code Online (Sandbox Code Playgroud)

  • 在不同的基于 Unix 的系统上,这些数字通常(但不总是)相同。最好使用信号名称。也就是说,使用kill -KILL 代替kill -9。 (9认同)
  • 默认信号(`kill &lt;pid&gt;`)是TERM。 (8认同)
  • 我要补充一点,`KILL` 和`STOP` 信号是所谓的不可捕获信号。这意味着当“TERM”信号被发送到一个进程时,它能够捕获它并执行它需要做的各种“关闭”操作。`KILL` 信号立即停止进程。 (7认同)
  • 最好先使用默认信号,只有在默认值不起作用时才使用 -9。这样做的原因是无法捕获 -9,因此程序没有机会进行任何清理。此外,您可以在“man 7 signal”中找到有关系统信号的文档 (5认同)

Den*_*son 7

默认信号是 TERM,它允许被杀死的程序在退出之前捕获它并进行一些清理。如果程序是这样编写的,它也可以忽略它。

指定 -9 或 KILL 作为信号不允许程序捕获它、进行任何清理或忽略它。它应该只用作最后的手段。

要在 Bash 中查看数字和信号名称列表,请使用kill -l(字母 ell)。