【ゾンビプロセス】

ゾンビプロセス とは?

最終更新:
💡 実行は終了。終了情報の回収を待っている状態

終了した子プロセスについて、親などが終了情報を回収するまで、PIDや終了状態などの最小限の情報が残っている状態。実行中のプロセスではないが、カーネルのプロセステーブルの枠を使う。

📌 このページのポイント
終了と情報の回収は別子が実行中終了・未回収状態 Z終了情報が残る回収済み✓終了wait系の処理親などが終了情報を取得する未回収のままだと管理情報とPIDが残る実行は終了済み。CPUで動き続ける状態ではない
Linuxの概念例。終了した子の情報をwaitなどで回収する。SIGCHLDを送るだけで必ず回収されるわけではない。
ひよこ ひよこ
終了したのに、何が残っているの?
ペンギン先生 ペンギン先生
Linuxでは、親などが子の終了情報を取得できるよう、PIDや終了状態、資源使用量などの最小限の情報を残すよ。終了した子の情報がwait系の処理で回収されていない状態をゾンビというんだ。
ひよこ ひよこ
CPUやメモリを使い続けるの?
ペンギン先生 ペンギン先生
終了済みなのでCPUでプログラムを実行し続けるわけではないよ。ただし管理情報は残り、プロセステーブルの枠を使う。「メモリをまったく使わない」とは言えない。大量に蓄積して枠が埋まると、新しいプロセスを作れなくなるんだ。
ひよこ ひよこ
どうやって見つけるの?
ペンギン先生 ペンギン先生
Linuxならps -eo pid,ppid,stat,cmdなどで、PID・親PID・状態を表示して確認できるよ。STATのZがゾンビを表す。単に出力全体をgrep Zで探すとコマンド名などにも一致するので、状態の列を確かめよう。
ひよこ ひよこ
killすれば消える?
ペンギン先生 ペンギン先生
すでに実行が終わっているため、ゾンビ自身に終了シグナルを送って回収する方法ではないよ。親が終了情報を回収する処理を調べるんだ。SIGCHLDを親へ送るだけで必ず回収されるわけでもない。親の再起動などは、ほかの処理への影響も確認して判断しよう。
ひよこ ひよこ
プログラムではどう防ぐの?
ペンギン先生 ペンギン先生
子の終了情報をwait()やwaitpid()などで回収するよ。複数の子が終わり得るなら、回収できる子を繰り返し処理し、戻り値やエラーも扱う。親が終了するとinitやsubreaperへ引き取られる仕組みもあるけれど、親側の回収処理を設計するのが基本だね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ゾンビプロセス」って出てきたら「実行は終わったが、終了情報の回収待ちで残る状態」と思えばだいたいOK!
📖 おまけ:英語の意味
「Zombie Process」 = 終了後も情報が残るプロセス
💬 実行は終わっているのに、情報が残っている姿をゾンビになぞらえた呼び方だよ。動き続けているという意味ではないんだ。

参考資料

← 用語集にもどる