ゾンビプロセスの理解と掃除
psの一覧にdefunctという表示が並び始めた。ゾンビプロセスとは何か、放置してよいのか、どう掃除するのかを確かめたい。
手順
ps aux | awk '$8 ~ /^Z/'STAT列がZのプロセス=ゾンビを一覧する。ゾンビは「終了済みだが、親が終了状態を回収(wait)していない」だけの残骸で、CPUもメモリもほぼ使わない。ps -o ppid= -p 4321ゾンビの親プロセスID(PPID)を調べる。ゾンビ自身はもう死んでいるためkillできない。対処するのは常に親のほう。ps -p 【親のPID】 -o pid,cmd親が何のプログラムかを確認する。自作デーモンやジョブ管理スクリプトが子の終了を回収し忘れているのが典型パターン。kill -s SIGCHLD 【親のPID】親に「子が終了したよ」と再通知してみる。行儀のよいプログラムならこれで回収してくれることがあるが、効かないことも多い。sudo systemctl restart 【親のサービス】効かなければ親を再起動する。親が終了するとゾンビはinit(PID 1)に引き取られ、即座に回収されて消える。ps aux | awk '$8 ~ /^Z/' | wc -l掃除後にゾンビの数がゼロになったか確認する。再び増え続けるなら、親プログラム側のwait処理のバグを直すのが根本対策。⚠
注意ゾンビ数体は実害がほぼ無いので慌てて再起動しないこと。ただし大量に増え続けるとプロセスID枯渇につながる。またゾンビにkill -9を撃っても無意味(既に死んでいる)で、対処先は必ず親。