当您尝试永久终止流程时,应使用哪个“ kill”选项?


26

我从人们那里收到很多混杂的消息,并且想知道它与您使用的内容是否真的没有太大区别。

kill 'x'
killall 'x'
kill -9 'x'

这些是到目前为止我被告知要使用的一些选项,但是有人说kill -9只是过大的杀伤力,单靠杀死是行不通的,等等。

在最标准的情况下(仅终止一个过程)(因此也包括它的状态),是否有人建议使用哪个?

[编辑]我在寻找要停止执行过程时要使用的内容,以便可以从头开始运行一个新的过程


1
另请参阅UUK9表单信,该警告不要滥用SIGKILL
jw013 2012年

1
列出所有不同的信号及其编号:kill -l并将数字转换为相应的信号名称,例如kill -l 9return KILL

Answers:


24

有许多信号的默认设置是终止该过程。最终的终止信号是SIGKILL,因为它无法处理,该过程别无选择,只能死亡。但是,这也意味着,如果您发送它,则该过程将失去清理的机会。因此,良好的举止要求发送诸如SIGTERM之类的信号,该信号可以首先处理,并且仅当该过程在一段时间后没有退出后才将其发送给SIGKILL。

请注意,SIGINT和SIGQUIT不是任意进程终止的良好候选者。由于它们可以从终端的键盘生成,因此许多应用程序将它们用于特殊目的。例如,python解释器使用SIGINT生成KeyboardInterrupt异常(也在交互式python会话中,它仅返回到提示),而JVM使用SIGQUIT转储堆栈跟踪。SIGINT和SIGQUIT对于大多数标准命令行实用程序(例如find或)仍然有效cat

在系统关闭期间,大多数UNIX和Linux系统都会将SIGTERM发送到所有进程,然后等待5秒钟,然后是SIGKILL。这是安全关闭任意进程的推荐方法。

还要注意,即使SIGKILL也可能无法终止陷入不间断等待中的进程,直到该进程唤醒。


1
极好的答案。您对此kill -SIGTERM $pid; sleep 5; kill -SIGKILL $pid;建议有参考吗?
l0b0 2012年

+1种答案。那SIGHUP呢?
Alois Mahdal

2
@AloisMahdal:SIGHUP来自拨号线路普及的那一天。发送该信号以表明线路已挂断。后来,这种情况不太常见SIGHUP,守护程序有时会使用它重新读取配置文件,而无需重新启动进程。在这些现代时代SIGHUP很少使用。许多守护程序将具有自己的重新初始化方式(即apachectl gracefulrndc reconfig。对于不这样做的事情,应[init.d|smf|upstart|launchd]尽可能使用控件。)
bahamat 2012年

13

您应该从最温和的一个开始,然后从那里升级。这意味着SIGINT,SIGTERM,SIGQUIT,SIGKILL。虽然大多数人都跳过SIGINT和SIGQUIT。


另外,某些应用程序(例如JDK)以不同的方式处理SIGQUIT。如果不知道特定应用程序如何处理它,我可能不会使用SIGQUIT。
dimo414 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.