为什么我们总是使用 kill -9

Ath*_*iri -3 kill signals

我想知道击杀阶段。我们总是使用kill -9而不是任何其他数字。任何人都可以解释原因。

the*_*rpy 15

实际上,我非常喜欢鲍勃的回答。

我使用的信号是:

  • -1( -HUP) - 重新启动一个进程
  • -2( -INT) - 终止进程
  • -9( -KILL) - 让内核把进程踢出去
  • -11( -SEGV) - 让程序崩溃
  • -15( -TERM) - 默认,请程序终止。

Kill 没有信号将发送-15( -TERM)。

以上所有信号名称都可以指定SIG前缀(例如-SIGKILL),但是,这是可选的。

注意,kill -11会强制程序退出并出现分段错误,我有时kill -9会使用它,当不会终止进程时。(如果您发出问题kill -9kill -11在进程中,您可能会丢失数据,所以要小心!)

您用于ps -ef | grep <program>检查过程。要摆脱进程(其父 PID 为 1),您必须kill -HUP 1kill -1 1(均以 root 身份)。请注意,PID 1 是您的初始化系统

所以,要终止一个进程,发出kill <pid>(与 完全相同kill -15 <pid>),如果失败,我尝试其他这些(你可能会丢失数据!),kill -2 <pid>(类似于做Ctrl+c),如果失败kill -9 <pid>,如果失败kill -11 <pid>,如果失败,过程是最有可能是僵尸进程,确保使用ps -ef | grep <program_name>or是这种情况ps -ef | grep <pid>,它应该在进程后提及“defunct”。这是当您发出kill -1 1.

某些程序,例如 Java JVM,可以配置为在收到信号时转储线程/堆(用于故障排除),在这些情况下,我也使用 kill ...


Bob*_*ger 11

最初,kill 命令/系统调用只是杀死了一个进程。这是由内核完成的,进程就消失了,从来没有被通知过。我想,这在第三版左右停止了。kill -9 表示将信号编号 9 发送到进程。与大多数(全部?取决于)其他信号不同,它不能被进程“捕获”并以任何方式处理。停止进程的一种更好的方法是 kill -15(或 kill -TERM),它告诉进程它正在被终止,但给它一个执行清理的机会。

使用 kill -9 是杀死进程的“保证”方式;如果卡住了,kill -15 可能并不总是有效。因此,许多人仍然使用 kill -9 作为“首选”。

“终极”杀戮信号是 9 号的原因正是他们这样做的方式。当时至少还有另外八个不同的信号,我猜这些数字是由编写内核那部分程序的人(可能是 Ken Thompson)分配的。一些较低的数字现在主要是历史数据,因为它们映射到 PDP-11 硬件中的硬件指令和/或事件。9以上的还有很多。

请注意,实际数字中没有级别或层次结构;信号 8 绝不“小于”信号 9 或“大于”信号 7。

  • @Athiri 那些不是杀伤力的“级别”或“阶段”,它们是[信号数字](http://www.comptechdoc.org/os/linux/programming/linux_pgsignals.html) (6认同)

Che*_*603 5

嗯……我想每个人的编程风格都不一样。就个人而言,我尽量避免发送,kill -9因为它往往会创建僵尸进程,因为它不允许它杀死的进程执行任何清理操作,这些操作可能存在于用户想要杀死的程序中,也可能不存在。

这是“最后的手段”信号,因此虽然它很少是终止程序的首选方式,但它很常用(特别是在编写不佳的程序中),因为它“始终有效”,可以这么说......

如果一个进程忽略SIGINTSIGTERM,那么应该有一个原因——也许该进程应该释放一个锁定文件,删除一些临时文件,和/或在终止之前执行一些其他“清理”操作。当然,程序确实会行为不端,因此我们确实需要SIGKILL那些(希望很少见的)场景。

唯一真正合适的用途 SIGKILL是当某个进程由于某种原因行为不端而无法正常终止时,或者当用户出于某种其他原因需要立即终止该进程时(例如,如果您不小心执行了木马程序而不是吓坏了) ,您可能希望确保快速且完全地终止程序)。

您可能经常看到它的原因是因为它是内核不能忽略的唯一信号。在 shell 中,您可以使用trap命令来亲自查看,但这很好地解释了kill -9它的作用:

来自外太空的信号 9

有一种信号是您不能捕获的:SIGKILL 或信号 9。内核立即终止发送此信号的任何进程,并且不执行任何信号处理。由于它总是会终止卡住、挂起或以其他方式出错的程序,因此当您必须停止并离开时,很容易认为这是一种简单的方法。通常,您会看到对以下发送 SIGKILL 信号的命令的引用:kill -9

然而,尽管它看起来很简单,但您必须记住,当您发送此信号时,应用程序不会进行任何处理。通常这是可以的,但对于许多程序来说却不是。特别是,许多复杂的程序(以及一些不那么复杂的程序)会创建锁定文件来防止程序的多个副本同时运行。当使用锁文件的程序被发送一个 SIGKILL 时,它在终止时没有机会删除锁文件。锁定文件的存在将阻止程序重新启动,直到手动删除锁定文件。

被警告。使用 SIGKILL 作为最后的手段。

来源