如何杀死僵尸进程

Posted

技术标签:

【中文标题】如何杀死僵尸进程【英文标题】:How to kill zombie process 【发布时间】:2013-06-01 10:42:06 【问题描述】:

我在前台启动了我的程序(一个守护程序),然后我用kill -9 杀死了它,但是我得到了一个僵尸,我无法用kill -9 杀死它。?

如果僵尸是一个死进程(已经被杀死),我如何从ps aux的输出中删除它?

root@OpenWrt:~# anyprogramd &
root@OpenWrt:~# ps aux | grep anyprogram
 1163 root      2552 S    anyprogramd
 1167 root      2552 S    anyprogramd
 1169 root      2552 S    anyprogramd
 1170 root      2552 S    anyprogramd
10101 root       944 S    grep anyprogram
root@OpenWrt:~# pidof anyprogramd
1170 1169 1167 1163
root@OpenWrt:~# kill -9 1170 1169 1167 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]

【问题讨论】:

ps -o ppid 1163 说什么?也就是说,1163的父母是谁?这是必须终止的进程。 【参考方案1】:

僵尸已经死了,所以你不能杀死它。要清理僵尸,必须由其父级等待,因此杀死父级应该可以消除僵尸。 (在父进程死亡后,僵尸进程将由 pid 1 继承,它会等待它并清除进程表中的条目。)如果您的守护进程正在生成成为僵尸的子进程,那么您就有一个错误。您的守护进程应该注意到它的孩子何时死亡,并在他们身上wait 以确定他们的退出状态。

如何向僵尸父进程的每个进程发送信号的示例(请注意,这非常粗糙,可能会杀死您不希望的进程。我不建议使用这种大锤) :

# Don't do this.  Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ print $2')

【讨论】:

如果僵尸进程是一个死进程(已经被杀死),我如何从ps aux的输出中删除它? 僵尸必须由其父级等待。找到它的父母,弄清楚为什么父母不关注孩子,然后向社会服务机构投诉。 ;) 假设你的进程产生了很多僵尸,'uniq' ids 是有意义的:kill $(ps -A -ostat,ppid | awk '/[zZ]/print $2' | sort -u) 通常情况下,如果你cat /proc/<pid>/status,你可以在PPid行中找到父级 只是想象非 IT 人员来到这里阅读本文。疯了。【参考方案2】:

您可以通过使用以下命令杀死其父进程来清理僵尸进程:

kill -HUP $(ps -A -ostat,ppid | awk '/[zZ]/ print $2 ')

【讨论】:

此命令从进程表中清除僵尸,但不会“杀死”僵尸。僵尸已经死了。 grep 不是必需的。 ps ... | awk '/[zZ]/print $2' AFAICS,此命令不会杀死僵尸,而是将 SIGHUP 发送到其父进程(如果它不处理 SIGHUP 并导致僵尸重新成为 init 的父进程,则可能会杀死父进程,如所述在上一个答案中)。所以要小心这个命令,它可能会杀死你没想到的东西...... 这对我不起作用。我做了“kill -HUP processID”并且该进程仍然作为僵尸存在 @WilliamPursell 回答问题时,请描述使用命令行的后果以及它的作用,因为它确实会杀死计算机上运行的所有程序。【参考方案3】:

我试过了:

ps aux | grep -w Z   # returns the zombies pid
ps o ppid returned pid from previous command   # returns the parent
kill -1 the parent id from previous command

这会起作用:)

【讨论】:

我的情况是僵尸是通过启动脚本和未明确删除的程序创建的,所以我清除了它。 为我工作。这将在某些情况下有效,当已失效的进程由另一个被杀死的进程产生时。 我在杀死父进程之前检查了它。我只是使用 -9 而不是 -1 杀死了它: kill -9 the parent id 我也不得不使用 -9 而不是 -1 来杀死我的【参考方案4】:

在http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/找到它

2) 来自另一位用户(Thxs Bill Dandreta)的一个很好的提示: 有时

kill -9 <pid>

不会杀死进程。运行

ps -xal

第4个字段是父进程,杀死一个僵尸的所有父进程,僵尸就死了!

例子

4 0 18581 31706 17 0 2664 1236 wait S ? 0:00 sh -c /usr/bin/gcc -fomit-frame-pointer -O -mfpmat
4 0 18582 18581 17 0 2064 828 wait S ? 0:00 /usr/i686-pc-linux-gnu/gcc-bin/3.3.6/gcc -fomit-fr
4 0 18583 18582 21 0 6684 3100 - R ? 0:00 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/cc1 -quie

185811858218583 是僵尸 -

kill -9 18581 18582 18583

没有效果。

kill -9 31706

移除僵尸。

【讨论】:

好吧,这对我来说刚刚杀死了init,现在我什么也做不了,不得不重新启动......僵尸进程是 Java,从 4GB 的 RAM 中占用了 3.4GB跨度> 【参考方案5】:

我试过了

kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk ' print $2 ')

它对我有用。

【讨论】:

【参考方案6】:

有时无法杀死父 ppid,因此杀死僵尸 pid

kill -9 $(ps -A -ostat,pid | awk '/[zZ]/ print $2 ')

【讨论】:

【参考方案7】:

在 mac 上,上述命令/指令均无效。要删除僵尸进程,您可以右键单击 docker-icon->troubleshot->clean/purge Data。

【讨论】:

【参考方案8】:

以上方法我都不敢尝试。

我的解决方案是 htop 然后检测哪个进程有 multiprocessing.spawn 并杀死 -9 它。

【讨论】:

如果你敢读别人的答案,你会看到接受的答案解释并给出确切的 kill 命令来运行(只需一步)

以上是关于如何杀死僵尸进程的主要内容,如果未能解决你的问题,请参考以下文章

如何使用子进程模块杀死(或避免)僵尸进程

Linux上寻找并杀死僵尸进程

Centos系统杀死僵尸进程

僵尸进程

Linux 如何杀死僵尸进程

如何清理僵尸进程(转载)