什么是僵尸进程以及如何杀死它?

什么是僵尸进程以及如何杀死它?

虚拟霰弹枪?

答案1

哦天哪!不不不。不要使用 kill -9。

它没有给这个过程一个机会来清理:

  1. 关闭套接字连接

  2. 清理临时文件

  3. 通知其子进程它要离开了

  4. 重置其终端特性等等。

一般来说,发送 15,然后等待一两秒,如果不行,就发送 2,如果还不行,就发送 1。如果还不行,就删除该二进制文件,因为程序行为很糟糕!

不要使用kill -9。不要为了整理花盆而开出联合收割机。

答案2

僵尸进程(实际上现在它们被称为<defunct>)并不是真正的进程。它只是进程表中的条目,因此父进程可以执行wait()系统调用

你不必担心它们。它们不占用任何资源,当它们的父进程调用时它们就会消失,或者wait()父进程本身死亡时它们也会消失。

答案3

但是,已经有一个公认的答案:您可以杀死僵尸进程。使用调试器连接到父进程并调用 waitpid 函数。例如:- 假设父进程的 PID=100,僵尸进程的 PID=200

$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit

答案4

僵尸进程除了进程树中的条目外,没有分配给它任何资源。当进程完成但父进程尚未完成时,就会发生这种情况收割它,(即,wait对其进行编辑)。

如果您愿意,可以尝试强制父进程执行此操作,方法是向父进程发送 SIGCHLD ( kill -20),但不能保证父进程一定会遵守该操作。

您经常会在短时间内看到它们(例如,在使用 top 查看进程树时) - 这是正常的;在子进程完成和父进程轮询它之间的时间片内 - 子进程将显示为僵尸。

但是,如果您看到僵尸进程持续存在 - 这并不正常 - 仍然没有必要担心 - 因为没有为死进程分配资源 - 这通常意味着该应用程序是由糟糕的开发人员编写的。

您唯一需要担心僵尸进程的时候是当您看到大量的僵尸进程时,例如当上面提到的相同的蹩脚应用程序处于负载之下时。

我工作的地方有很多糟糕的开发人员,所以我有幸处理这些问题,并在处理过程中学习各种无用的东西。事实上,我的团队经常在面试中使用我们糟糕的开发人员编写的糟糕 shell 脚本 - 如果候选人能挑出脚本确实很糟糕,并告诉我们为什么它很糟糕,那么他就有很大的机会进入面试。

相关内容