杀死进程的命令中,kill和kill -9有何不同?

7
有人能解释一下kill和kill -9之间的区别吗?谢谢。

3
你在kill命令的手册页中哪部分有困难? - Ignacio Vazquez-Abrams
1
首先,阅读 man kill。然后查看 Unix_signal - on wikipedia,接着阅读 man 7 signal - clt60
2
StackOverflow的范围是关于编写软件的问题 - 具体来说,是关于“软件开发中独特的问题”; kill -9经常被非开发软件的人使用。请考虑到SuperUserUnix SE。在那里:为什么我不应该kill -9一个进程? - Charles Duffy
Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎不属于编程或开发范畴。请参阅帮助中心中的我可以在这里问什么样的问题。也许超级用户Unix&Linux Stack Exchange更适合提问。 - jww
3个回答

19

kill,又称kill -TERMkill -15,是终止进程的安全正确方式。它相当于安全地关闭计算机。

kill -9是残忍地结束进程的不安全方式。它相当于拔掉电源线,可能会导致数据损坏。

更多信息请参见Linux&Unix堆栈交换


我喜欢你的比喻。对于那些想要了解更多关于SIGTERM和SIGKILL的人,你可能想要查看这个链接:https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html。 - jumping_monkey

2

kill 是一个用于向一个或多个进程发送不同信号的实用程序(通常用于终止、暂停、继续等操作进程)。

当执行 kill 时没有指定任何信号编号(有时称为信号代码),默认使用信号编号 15,相当于 SIGTERM 信号名称。

另一个信号编号是 9,它相当于 SIGKILL 信号名称。

kill -15 PID(与 kill PID 相同)和 kill -9 PID 的区别在于前者平稳地关闭指定的进程,而后者强制关闭进程及其所有子进程。


通常,要终止特定进程,你可以使用以下四种替代方式之一:
  • kill -signalnumber PID
  • kill -s signalnumber PID
  • kill -SIGNALNAME PID
  • kill -s SIGNALNAME PID

(PID 代表进程 ID)


2
使用Kill和Kill -9命令都可以杀死进程,但区别在于接收到Kill或者Kill -9命令的进程被杀死后的行为。
使用Kill命令会生成一个SIGTERM信号请求被杀死的进程正常退出,即释放内存或处理其他子进程。使用Kill命令杀死进程不会产生任何副作用,例如未释放的内存,因为它被正常地杀死了。
Kill -9的工作方式类似,但它不等待程序正常退出。Kill -9生成一个SIGKILL信号,该信号不会检查进程的状态并立即杀死进程。
在编码/编程环境中,如果进程仍然需要达到安全状态(清除内存或类似活动),则可以捕获和处理由Kill生成的SIGTERM信号,在此期间进程可能不会立即被杀死并需要一些时间来清除资源然后才退出。而进程无法忽略由Kill -9生成的SIGKILL信号,无论它们处于什么状态,它们都将立即被杀死(这可能会导致某些问题,但进程肯定会被杀死)。事实上,进程甚至没有意识到SIGKILL信号的存在,因为信号直接发送到内核init。此时,init将停止该进程。进程永远不会有机会捕获该信号并对其进行操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接