我什么时候不应该杀死-9进程?

我什么时候不应该杀死-9进程?

我总是很犹豫要不要运行kill -9,但我看到其他管理员几乎经常这样做。

我认为可能有一个合理的中间立场,所以:

  1. 何时以及为何kill -9使用?什么时候以及为什么不呢?
  2. 做之前应该尝试什么?
  3. 什么样的调试“挂起”进程可能会导致进一步的问题?

答案1

一般来说,您应该在( ) 之前使用kill(缩写为kill -s TERM,或在大多数系统上kill -15),以便让目标进程有机会自行清理。 (进程无法 catch 或ignore ,但它们可以并且经常会 catch 。)如果您不给进程机会完成其正在执行的操作并进行清理,它可能会在其周围留下损坏的文件(或其他状态)重新启动后将无法理解。kill -9kill -s KILLSIGKILLSIGTERM

strace/ trussltrace通常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>

如何终止父进程为 init 的 <defunct> 进程?

进程什么是失效的以及为什么它不会被杀死?

因此,在尝试运行kill -9一个<defunct>进程之前ps -ef,请先查看其父进程是什么,然后尝试对其父进程执行-15(TERM)或-2(INT),最后(KILL)。-9

笔记: 什么ps -ef

稍后编辑并注意:终止进程、其父进程或子进程时要小心,因为它们可能会使文件打开或损坏、连接未完成、可能损坏数据库等,除非您知道kill -9进程的作用,仅将其用作最后的手段,并且如果您需要要运行kill,请在使用之前使用上面指定的信号-9 (KILL)

相关内容