當前位置: 首頁>>技術教程>>正文


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/zh-tw/article/7676.html,未經允許,請勿轉載。