我总是很犹豫要不要运行kill -9
,但我看到其他管理员几乎经常这样做。
我认为可能有一个合理的中间立场,所以:
- 何时以及为何
kill -9
使用?什么时候以及为什么不呢? - 做之前应该尝试什么?
- 什么样的调试“挂起”进程可能会导致进一步的问题?
答案1
一般来说,您应该在( ) 之前使用kill
(缩写为kill -s TERM
,或在大多数系统上kill -15
),以便让目标进程有机会自行清理。 (进程无法 catch 或ignore ,但它们可以并且经常会 catch 。)如果您不给进程机会完成其正在执行的操作并进行清理,它可能会在其周围留下损坏的文件(或其他状态)重新启动后将无法理解。kill -9
kill -s KILL
SIGKILL
SIGTERM
strace
/ truss
,ltrace
通常gdb
是了解卡住进程卡住原因的好主意。 (truss -u
在 Solaris 上特别有用;我发现ltrace
经常以不可用的格式向库调用提供参数。)Solaris 也有有用的/proc
基于 的工具,其中一些已移植到 Linux。 (pstack
通常很有帮助)。
答案2
兰德尔·施瓦茨 (Randal Schwartz) 过去经常在列表中发布“无用的 (x) 使用”。其中一篇文章是关于kill -9
.它包括原因和遵循的秘诀。这是重建版本(下面引用)。
(引用令人厌恶的内容)
不不不。不要使用kill -9。
它没有给该过程一个干净利落的机会:
1)关闭socket连接
2)清理临时文件
3)通知它的孩子它即将消失
4)重置其终端特性
等等等等。
一般来说,发送 15,然后等待一两秒,如果不起作用,则发送 2,如果不起作用,则发送 1。如果不起作用,请删除二进制文件,因为该程序的行为很糟糕!
不要使用kill -9。不要只是为了整理花盆而拿出联合收割机。
只是 Usenet 的另一个无用用途,
(。签名)
答案3
从程序员的角度来看,这样做应该总是可以的kill -9
,就像通过拉电源线来关机应该总是可以的一样。它可能是反社会的,并且需要一些恢复工作,但它应该有效,并且对于不耐烦的人来说是一个强大的工具。
我是作为一个会先尝试 plain 的人这么说的kill (15)
,因为它确实给了程序一个进行一些清理的机会——也许只是写入日志“exiting on sig 15”。但我不会接受任何关于 的不良行为的投诉kill -9
。
原因:
- 你无法阻止顾客做傻事。
- 随机
kill -9
测试是一个良好且公平的测试场景。 - 如果你的系统不能处理它,那么你的系统就坏了。
然而,并非我们使用的每个软件都是理想的。
此外,如果您使用kill -9
,在任何情况下,无论代码的稳健性如何,总是存在丢失数据的风险。
答案4
所有其他答案中都没有提到一种情况,当一个进程被杀死并且不能被杀死kill -9
时,根本不起作用:<defunct>
因此,在尝试运行kill -9
一个<defunct>
进程之前ps -ef
,请先查看其父进程是什么,然后尝试对其父进程执行-15
(TERM)或-2
(INT),最后(KILL)。-9
笔记: 什么ps -ef
是。
稍后编辑并注意:终止进程、其父进程或子进程时要小心,因为它们可能会使文件打开或损坏、连接未完成、可能损坏数据库等,除非您知道kill -9
进程的作用,仅将其用作最后的手段,并且如果您需要要运行kill,请在使用之前使用上面指定的信号-9 (KILL)