当前位置: 首页>>技术教程>>正文


linux – 如何杀死僵尸进程

, , , ,

问题描述

我在前台启动了程序(守护程序),然后用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    [cwmpd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [cwmpd]

最佳方案

僵尸已经死了,所以您无法杀死它。要清理僵尸,必须等待其父级等待,因此杀死父级应该可以消除僵尸。 (父对象死后,僵尸将被pid 1继承,而pid 1将等待该僵尸并清除其在进程表中的条目。)如果守护程序正在生成成为僵尸的子代,则您有一个bug。您的守护程序应注意其子项何时死亡,并在其上进行wait以确定其退出状态。

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

kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')

次佳方案

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

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

第三种方案

我试过了:

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}

这将工作:)

第四种方案

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

2)这是其他使用者(Thxs Bill Dandreta)的重要建议:有时

kill -9 <pid>

不会杀死进程。跑

ps -xal

第四场是父进程,杀死所有僵尸的父母,僵尸死亡!

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

移除僵尸。

第五种方案

我试过了

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

它对我有用。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/7676.html,未经允许,请勿转载。