【ゾンビプロセス】

ゾンビプロセス とは?

💡 仕事は終わったのに退場できない幽霊社員、放っておくと席だけ埋まっていく
📌 このページのポイント
ゾンビプロセスの発生と解消 正常な流れ 親プロセス fork 子プロセス 終了 終了済み wait() 親が回収 → 正常消滅 ゾンビが発生する流れ 親プロセス 子(終了済) 状態: Z wait() を 呼ばない! ゾンビプロセス PIDを占有し続ける 解決法1: 親にSIGCHLDを送信 kill -SIGCHLD <親PID> → wait()を促す → ゾンビが回収される 解決法2: 親プロセスを終了 親を終了 → ゾンビはinitに引き取られ → initが代わりに回収
ゾンビプロセスの発生メカニズムと解消方法
ひよこ ひよこ

ゾンビプロセスって怖い名前だけど、何なの?

ペンギン先生 ペンギン先生

プログラムの実行が終わったのに、プロセスの「残骸」がシステムに残っている状態だよ。Linuxでは子プロセスが終了すると、親プロセスが「ちゃんと終わったね」と確認(wait)するまで、プロセステーブルにエントリが残るんだ。この確認されないまま残った状態がゾンビだよ

ひよこ ひよこ

ゾンビプロセスが残ると何か困るの?

ペンギン先生 ペンギン先生

1〜2個なら問題ないけど、バグのあるプログラムが大量のゾンビを作ると、PID(プロセスID)が枯渇して新しいプロセスを起動できなくなるんだ。CPUやメモリは使わないけど、席だけ占領している幽霊社員みたいなものだね

ひよこ ひよこ

ゾンビプロセスを消すにはどうすればいいの?

ペンギン先生 ペンギン先生

ゾンビ自体を直接killすることはできないんだ。すでに死んでいるからね。解決方法は親プロセスに SIGCHLD シグナルを送って wait() を促すか、親プロセス自体を終了させること。親が終了すると、ゾンビはinitプロセス(PID 1)に引き取られて、initが代わりに回収してくれるよ

ひよこ ひよこ

どうやって見つければいいの?

ペンギン先生 ペンギン先生

ps aux | grep Z で状態が「Z」のプロセスを探せるよ。ps -eo pid,ppid,stat,cmd | grep Z なら親プロセスのPIDもわかるから、原因の特定がしやすいね

ひよこ ひよこ

プログラムを書くときにゾンビを防ぐ方法ってあるの?

ペンギン先生 ペンギン先生

いくつかあるよ。親プロセスで wait() や waitpid() を呼ぶのが基本。シグナルハンドラで SIGCHLD を受けたときに waitpid(-1, &status, WNOHANG) を呼ぶパターンが定番だね。もっと簡単な方法として signal(SIGCHLD, SIG_IGN) で子の終了を無視する設定にすると、カーネルが自動的に回収してくれるんだ。これはベテランでも意外と知らないテクニックだよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ゾンビプロセス」って出てきたら「終了済みなのに残骸が残っているプロセス」と思えればだいたいOK!
📖 おまけ:英語の意味
「zombie process」 = ゾンビプロセス
💬 死んだのに成仏できずに残っている様子がゾンビに似ていることから名付けられたよ
← 用語集にもどる