ゾンビプロセスを殺す方法


184

フォアグラウンドでプログラム(デーモンプログラム)を起動し、それをで殺しました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年

回答:


250

ゾンビはすでに死んでいるので、殺すことはできません。ゾンビをクリーンアップするには、親が待機する必要があるため、親を殺すことでゾンビを排除する必要があります。(親が死んだ後、ゾンビはpid 1によって継承されます。pid1はそれを待機し、プロセステーブルのエントリをクリアします。)デーモンがゾンビになる子を生成している場合は、バグがあります。デーモンは、その子がいつ死ぬwaitかを認識して、終了ステータスを決定する必要があります。

ゾンビの親であるすべてのプロセスにシグナルを送信する方法の例(これは非常に粗雑であり、意図しないプロセスを強制終了する可能性があることに注意してください。この種のスレッジハンマーの使用はお勧めしません):

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

1
ゾンビが死んだプロセス(すでに殺された)である場合、どのようにしてそれを出力から削除しps auxますか?
モハメド2013年

186
ゾンビはその親に待たされる必要があります。その親を見つけて、その親が子供に注意を払っていない理由を理解してから、社会福祉サービスに苦情を提出してください。;)
William Pursell 2013年

1
:IDSあなたはゾンビの多くを生産するプロセスを持っていると仮定すると、それは「UNIQ」に理にかなってkill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
ankon

2
通常、次の場合は親がPPid並んでいますcat /proc/<pid>/status
Daniel AndreiMincăSep

2
ここに来てこれを読んでいるIT以外の人々を想像しただけです。クレイジー。
ZitRo

68

次のコマンドで親プロセスを強制終了することにより、ゾンビプロセスをクリーンアップできます。

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

6
このコマンドはプロセステーブルからゾンビをクリアしますが、ゾンビを「殺す」ことはしません。ゾンビはすでに死んでいます。
ウィリアムパーセル2014

8
grep必要はありません。 ps ... | awk '/[zZ]/{print $2}'
ウィリアムパーセル2014

2
AFAICS、このコマンドはゾンビを殺しませんが、SIGHUPをその親プロセスに送信します(おそらく、SIGHUPを処理しない場合は親を殺し、前の回答で説明したように、ゾンビの親をinitに変更します)。したがって、このコマンドには注意が必要です。予期していないものを
強制終了

1
これではうまくいきませんでした。「kill -HUP processID」を実行しましたが、プロセスはゾンビとしてまだ存在しています
kommradHomer '10

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
私のために働いた。これは、機能停止したプロセスがanther killedプロセスによって生成された場合に機能します。
エリックS.ブリントン2014年

2
私はそれを殺す前に親プロセスが何であるかをチェックしました。そして、私は-1の代わりに-9を使用してそれを殺しました:kill -9 {親ID}
Ali

私はまた、-1の代わりに-9を使用して地雷を倒さなければなりませんでした
Michael Smith

27

でそれを見つけた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

ゾンビを削除します。


3
まあそれinitは私のために殺されました、そして今私は何もできず、再起動を余儀なくされています...ゾンビプロセスはJavaであり、4GBのRAMから3.4GBを取ります
Tcll

22

私は試した

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

そしてそれは私のために働きます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.