1. ホーム
  2. linux

[解決済み】ゾンビプロセスを終了させる方法

2022-04-14 20:14:44

質問

自分のプログラムをフォアグラウンドで起動し(デーモンプログラム)、そのプログラムを 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]

解決方法は?

ゾンビはすでに死んでいるので、殺すことはできません。 ゾンビを掃除するには、親に待ってもらう必要があるので、親を殺すとゾンビがいなくなるように働くはずです。 (親が死んだ後、ゾンビはpid 1に継承され、pid 1はゾンビを待ち、プロセステーブルのそのエントリをクリアします)。 もし、あなたのデーモンがゾンビになる子供を産んでいるなら、バグがあります。 あなたのデーモンは、その子供が死ぬと、それに気づき wait を実行し、その終了ステータスを決定します。

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

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