我想知道击杀阶段。我们总是使用kill -9
而不是任何其他数字。谁能解释一下原因。
答案1
事实上,我很喜欢鲍勃的回答。
我使用的信号是:
-1
(-HUP
) - 重新启动进程-2
(-INT
) - 终止进程-9
(-KILL
) - 让内核踢出进程-11
(-SEGV
) - 让程序严重崩溃-15
(-TERM
) - 默认,请终止程序。
无信号杀死将发送-15
( -TERM
)。
所有上述信号名称都可以指定SIG
前缀(例如-SIGKILL
),但是,这是可选的。
注意,kill -11
将强制程序因分段错误而退出,我有时会使用它,但kill -9
不会终止进程。 (如果您发出kill -9
或kill -11
在进程中,您可能会丢失数据,所以要小心!)
您用来ps -ef | grep <program>
检查过程。要删除一个进程(其父进程 PID 为 1),您必须使用kill -HUP 1
或kill -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>
或 的情况下ps -ef | grep <pid>
,它应该在进程后提及“已失效”。这是当你发出kill -1 1
.
某些程序(例如 Java JVM)可以配置为在收到信号时转储线程/堆(用于故障排除),在这些情况下我也使用kill...
答案2
最初,kill 命令/系统调用只是杀死了一个进程。这是由内核完成的,进程就消失了,从未收到任何通知。我认为这在第三版左右就停止了。 Kill -9 表示向进程发送 9 号信号。与大多数(所有?这取决于)其他信号不同,它不能被进程“捕获”并以任何方式处理。停止进程的一种更好的方法是kill -15(或kill -TERM),它告诉进程它正在被终止,但给它一个执行清理的机会。
使用kill -9 是终止进程的“有保证”的方法;如果卡住了,kill -15 可能并不总是有效。因此,许多人仍然将kill -9作为“第一手段”。
“最终”杀戮信号是数字 9 的原因就是他们这样做的方式。当时至少还有另外八个不同的信号,我猜这些数字是由对内核的该部分进行编程的人(可能是 Ken Thompson)分配的。一些较低的数字现在很大程度上已成为历史,因为它们映射到 PDP-11 硬件中的硬件指令和/或事件。而且还有很多其他的多于9.
请注意,实际数字中没有级别或层次结构;信号 8 决不会“小于”信号 9 或“大于”信号 7。
答案3
嗯...我想每个人的编程风格都不同。就我个人而言,我尝试避免发送kill -9
if I can 因为它往往会创建僵尸进程,因为它不允许它杀死的进程执行任何清理用户想要终止的程序中可能存在或不存在的操作。
这是“最后手段”信号,因此虽然很少首选终止程序的方法,它很常用,(特别是在写得不好的程序中),因为它“总是有效”,可以这么说......
如果一个进程忽略了SIGINT
或SIGTERM
, 则有应该这是一个原因——也许进程应该释放锁定文件,删除一些临时文件,和/或在终止之前执行一些其他“清理”操作。当然,程序确实会出现错误,因此我们确实需要SIGKILL
这些(希望很少见)场景。
唯一真正合适的用途 SIGKILL
是当进程由于某种原因行为不当而无法正确终止时,或者当用户因其他原因需要立即终止进程时(例如,如果您不小心执行了木马并且惊慌失措) ,您可能需要确保快速且完全地终止该程序)。
你之所以经常看到它是因为它是内核唯一的信号不能忽略。在 shell 中,您可以尝试使用该trap
命令来亲自查看,但这很好地解释了其作用kill -9
:
来自外太空的 9 号信号
有一个信号不能捕获:SIGKILL 或信号 9。内核立即终止发送此信号的任何进程,并且不执行任何信号处理。因为它总是会终止一个卡住、挂起或以其他方式搞砸的程序,所以当你必须让某些东西停下来并离开时,你很容易认为这是一个简单的出路。通常您会看到对以下发送 SIGKILL 信号的命令的引用:kill -9
然而,尽管它看起来很简单,但您必须记住,当您发送此信号时,应用程序不会进行任何处理。通常这是可以的,但对于许多程序来说却并非如此。特别是,许多复杂的程序(以及一些不太复杂的程序)会创建锁定文件以防止程序的多个副本同时运行。当使用锁定文件的程序被发送 SIGKILL 时,它在终止时没有机会删除锁定文件。锁定文件的存在将阻止程序重新启动,直到手动删除锁定文件。
被警告。使用 SIGKILL 作为最后的手段。
答案4
我喜欢这个帖子,因为它让人回想起我曾经在现场帮助我爸爸(80 年代初)在旧的 Burroughs/Unisys 系统上工作的日子……一直到现在,杀略有演变(由于各种原因)。
首先,感谢 @thecarpy 和 Bob 的回复。
第二,杀根据 Unix/类 Unix 系统(或 shell)的实现,可以具有不同的含义。起初,杀是对基于模块/基于单片的内核的直接系统调用,以允许用户从内存中删除活动进程。关键是,此命令是内核空间(ring0)、ring3(用户空间)或更高级别用户破坏贪婪/失控进程吸收旧主/中框架系统资源的一种手段。
三、总体目的杀是为了确保 PID 具有要发送的 SIGKILL 的句柄——每个进程/每个终端/每个运行级别。
对于类 Unix 系统,杀-9恕我直言,使用得太频繁,因为它已经说过它可能会留下僵尸进程。这是由于基于分叉、管道衬砌的父进程->子进程 PID 关系以及初始 PID/进程产生子进程等的其他原因。
该命令非常有用,因为它很危险,但应该首先调查了解相关选项(如上所述)和有问题的 PID(从 shell 脚本到核心数据库进程):
ps-aef | grep -i
一旦确定,我就用kill -15来防止僵尸进程和失控进程(例如在MySQL的早期),以节省系统资源,但是了解发送进程的正确信号也很重要:https://en.wikipedia.org/wiki/Kill_(命令)
如有疑问,请尝试使用删除用于命名进程的命令,例如 mariadb/httpd 或 Kill -15 来立即取消进程。