var*_*tec 21

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

你不应该担心他们。它们不占用任何资源,它们也会wait()在父母死亡时它们的父母调用它们而消失。


小智 18

天啊!不不不。不要使用kill -9。

它没有给进程一个干净的机会:

  1. 关闭套接字连接

  2. 清理临时文件

  3. 通知它的孩子它正在消失

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

通常,发送 15,然后等待一两秒钟,如果这不起作用,则发送 2,如果不起作用,则发送 1。如果没有,请删除二进制文件,因为该程序表现不佳!

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

  • kill -9 不会杀死僵尸。你必须杀死他们的父母,看看 pstree。 (13认同)
  • @LapTop006:在那种情况下,他们更像是吸血鬼;杀死头部吸血鬼以阻止入侵。 (3认同)
  • 这个答案几乎在所有方面都是错误的。过程完成;它已经关闭了它的连接,清理了临时文件等等。不再有实际的进程,只是进程表中的一个条目。不要删除子二进制文件 - 它的行为并不坏。这只是意味着父母还没有为孩子举行适当的葬礼。 (2认同)

小智 14

然而,已经有一个公认的答案:你可以杀死僵尸进程。将调试器附加到父进程并调用 waitpid 函数。例如: - 让我们假设父进程的 PID=100,僵尸进程的 PID=200

$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit
Run Code Online (Sandbox Code Playgroud)


ned*_*edm 11

这是一个已完全释放但仍存在于进程表中的进程。 将此与孤儿进程进行对比,其父进程已死亡但仍在执行。

这里有 一些 关于摆脱它们的建议


Xer*_*xes 9

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

如果您愿意,您可以通过向父级发送 SIGCHLD ( kill -20)来尝试强制父级执行此操作,但不能保证父级会尊重它。

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

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

您唯一应该关注僵尸进程的时候,是当您看到大量僵尸进程时,例如,如果上述相同的蹩脚应用程序处于负载状态。

我工作的地方有很多糟糕的开发人员,所以我有幸处理这些问题并在这样做的同时学习各种无用的东西。事实上 - 我的团队经常在面试中使用由蹩脚的开发人员编写的蹩脚的 shell 脚本 - 如果应聘者可以选择该脚本确实是蹩脚的,并告诉我们它为什么蹩脚,那么他就有了很好的立足点。