如何杀死僵尸进程


183

我在前台启动了我的程序(守护程序),然后用杀死了该程序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]

2
什么ps -o ppid 1163发言权?也就是说,谁是1163的父母?那是必须终止的过程。
William Pursell 2013年

Answers:


247

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

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

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

1
如果僵尸是一个死进程(已经被杀死),我如何将其从输出中删除ps aux
MOHAMED

185
僵尸必须由其父等待。找到其父母并弄清楚为什么该父母不注意其子女,然后向社会服务机构投诉。;)
William Pursell 2013年

1
假设您有产生大量僵尸的过程,则“ uniq” id是有意义的:kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
ankon

2
通常,PPid如果您愿意,您可以在该行中找到父母cat /proc/<pid>/status
Daniel AndreiMincă18

1
只是想象着非IT人员会来这里阅读。疯。
ZitRo

68

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

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

6
该命令从进程表中清除僵尸,但不会“杀死”僵尸。僵尸已经死了。
威廉·珀塞尔

8
grep是没有必要的。 ps ... | awk '/[zZ]/{print $2}'
威廉·珀塞尔

2
AFAICS,此命令不会杀死僵尸,而是将SIGHUP发送到其父进程(如上一个答案所述,如果它不处理SIGHUP,则可能杀死父进程,并使僵尸重新初始化为init)。因此,请谨慎使用此命令,它可能会杀死您不希望看到的东西……
Matthijs Kooijman 2014年

1
这对我没用。我做了“ kill -HUP processID”,进程仍然像僵尸一样存在
kommradHomer 2014年

1
@WilliamPursell回答问题时,请描述使用命令行的后果及其显式执行的操作,因为它会杀死计算机上运行的所有程序。
Dalek

39

我试过了:

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}

这将工作:)


在我的情况下,僵尸是通过启动脚本和一个程序创建的,该脚本未明确删除,因此我将其清除。
Mohammad Rafiee 2013年

1
为我工作。在某些情况下,当由花药杀死的进程催生了已终止的进程时,这将起作用。
埃里克·S·布林顿

2
在杀死它之前,我检查了父进程。我只是使用-9而不是-1杀死了它:kill -9 {parent id}
Ali

我还必须使用-9来杀死我,而不是-1
Michael Smith

26

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

移除僵尸。


3
好吧,这只是init对我杀了,现在我什么也做不了,被迫重启...僵尸进程是Java,从4GB RAM中提取了3.4GB
Tcll 2015年

22

我试过了

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

它对我有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.