the*_*rpy 15
实际上,我非常喜欢鲍勃的回答。
我使用的信号是:
-1
( -HUP
) - 重新启动一个进程-2
( -INT
) - 终止进程-9
( -KILL
) - 让内核把进程踢出去-11
( -SEGV
) - 让程序崩溃-15
( -TERM
) - 默认,请程序终止。Kill 没有信号将发送-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>
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。
嗯……我想每个人的编程风格都不一样。就个人而言,我尽量避免发送,kill -9
因为它往往会创建僵尸进程,因为它不允许它杀死的进程执行任何清理操作,这些操作可能存在于用户想要杀死的程序中,也可能不存在。
这是“最后的手段”信号,因此虽然它很少是终止程序的首选方式,但它很常用(特别是在编写不佳的程序中),因为它“始终有效”,可以这么说......
如果一个进程忽略SIGINT
或SIGTERM
,那么应该有一个原因——也许该进程应该释放一个锁定文件,删除一些临时文件,和/或在终止之前执行一些其他“清理”操作。当然,程序确实会行为不端,因此我们确实需要SIGKILL
那些(希望很少见的)场景。
唯一真正合适的用途 SIGKILL
是当某个进程由于某种原因行为不端而无法正常终止时,或者当用户出于某种其他原因需要立即终止该进程时(例如,如果您不小心执行了木马程序而不是吓坏了) ,您可能希望确保快速且完全地终止程序)。
您可能经常看到它的原因是因为它是内核不能忽略的唯一信号。在 shell 中,您可以使用trap
命令来亲自查看,但这很好地解释了kill -9
它的作用:
来自外太空的信号 9
有一种信号是您不能捕获的:SIGKILL 或信号 9。内核立即终止发送此信号的任何进程,并且不执行任何信号处理。由于它总是会终止卡住、挂起或以其他方式出错的程序,因此当您必须停止并离开时,很容易认为这是一种简单的方法。通常,您会看到对以下发送 SIGKILL 信号的命令的引用:kill -9
然而,尽管它看起来很简单,但您必须记住,当您发送此信号时,应用程序不会进行任何处理。通常这是可以的,但对于许多程序来说却不是。特别是,许多复杂的程序(以及一些不那么复杂的程序)会创建锁定文件来防止程序的多个副本同时运行。当使用锁文件的程序被发送一个 SIGKILL 时,它在终止时没有机会删除锁文件。锁定文件的存在将阻止程序重新启动,直到手动删除锁定文件。
被警告。使用 SIGKILL 作为最后的手段。