【问题标题】:Can't cleanup a zombie process whose parent is init无法清理父进程为 init 的僵尸进程
【发布时间】:2013-12-30 09:19:02
【问题描述】:

我有一个僵尸进程:

$ ps aux | grep Zl
root      6641  122  0.0  0 0 ? Zl   08:57 371:10 [ovs_dpdk] <defunct>

而且,它的父级看起来像 init

$ pstree
init─┬─acpid
     ├─atd
     ├─cron
     ├─dbus-daemon
     ├─dnsmasq
     ├─6*[getty]
     ├─irqbalance
     ├─libvirtd───10*[{libvirtd}]
     ├─ovs_dpdk───{ovs_dpdk}               <==== here
     ├─rpc.idmapd

但是,kill -9 并没有杀死他……

sudo kill -9 6641

我被难住了,有什么帮助吗?

【问题讨论】:

  • 这更适合unix.stackexchange。但是你试过kill -SIGKILL 6641吗?
  • -SIGKILL 没有帮助。

标签: linux kill zombie-process


【解决方案1】:

你不能杀死僵尸,因为它已经死了。 :-)

说真的,一个僵尸进程已经退出了,所以没有什么可以杀死的。它在进程表中的条目一直存在,直到创建(现已死亡)子进程的父进程看到退出状态。

Wikipedia (who else?) has a great discussion of this.

您可以使用 SIGCHLD 删除进程条目,方法是告诉其父进程获取死掉的子进程:

kill -s SIGCHLD PPID

其中 PPID 是父进程 ID。 ht the xmodulo folks

【讨论】:

  • 真正的问题是,由于僵尸进程以用户身份使用内核模块,内核模块中的引用计数增加。我想做的是卸载内核模块,但是由于引用计数不是0,所以我不能这样做。除了重启,我还能做什么?
  • 好问题。 This linkinit 应该定期运行 wait() 以收割僵尸。如果您的系统没有这样做,那么重启似乎是您唯一的选择。
【解决方案2】:

僵尸是一个已经退出并且不再运行的进程,但会一直停留在进程表中,直到它的父进程“wait()s”为它......以获取它的退出状态。杀死父母,或者让它等待它的孩子。

【讨论】:

  • 一旦父进程死亡,init(进程 1)将其作为子进程继承,并且 init 始终等待任何子进程退出。
【解决方案3】:

Kill 命令无法清理僵尸。如果它是 Init process (pid = 1) 的子进程,那么它应该自动清理。

或 由于初始化进程没有清理只是重新启动系统

如果僵尸再次生成,那么可能是代码错误。您需要查看代码问题:因为父母不等待孩子获得返回退出代码。

作为参考,这里引用了各种示例Generation and cleanup of Zombies n C 可能会有所帮助。

【讨论】:

  • 点评来源: 嗨,虽然链接是分享知识的好方法,但如果它们将来被破坏,它们将不会真正回答问题。将回答问题的链接的基本内容添加到您的答案中。如果内容太复杂或太大而无法在此处放置,请描述所提出解决方案的总体思路。请记住始终保留指向原始解决方案网站的链接引用。见:How do I write a good answer?
  • 感谢您抽出宝贵时间查看此内容。我关心的是供参考,我可以使用该链接,因为示例回复会太大。
【解决方案4】:

如何杀死僵尸进程?

你不能杀死僵尸,因为它们已经死了。但是如果你有太多的僵尸,那么杀死父进程或重新启动服务。

您可以使用从上述任一命令获得的 PID 杀死僵尸进程。例如杀死具有 PID 4104 的僵尸进程: 杀死 -9 4104

参考 - http://www.cyberciti.biz/tips/killing-zombie-process.html

【讨论】:

  • 如果父进程是init进程呢?
猜你喜欢
  • 1970-01-01
  • 2017-03-21
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2014-01-08
  • 2014-09-30
  • 1970-01-01
相关资源
最近更新 更多