ゾンビプロセス(正式名称: zombie process / defunct process)- すでに終了したのに、親プロセスがその終了ステータスを回収(
wait())していない子プロセス - デメリット
- プロセスがいなくなった後も、PID(プロセス番号)とプロセステーブルの1エントリを占有し続ける
- ゾンビが大量に溜まるとプロセステーブルが枯渇し、新しいプロセスを作れなくなる
- 原因は親プロセスのバグ(
wait() のし忘れ)なので、ゾンビの存在は親側の問題のサイン
孤児プロセス(正式名称: orphan process)- 親プロセスが先に終了してしまい、親がいなくなった子プロセス
- カーネルが
initを新しい親にする=再ペアレント(reparenting) - デメリット
- それ自体は基本無害(
init がちゃんと面倒を見て、終了時に wait() してくれるのでゾンビ化しない) - ただし意図せず孤児化すると、本来の親が管理・監視できなくなる(ログやライフサイクルの追跡が切れる)
- 親に「見守られない」まま動き続けるバックグラウンドプロセスが残るのは、運用上は見落としの原因になりうる
図解
【正常】親が wait() で子の終了を回収
parent ──fork──▶ child(実行中)
parent ◀─wait()── child(exit) → 子は完全に消滅 ✅
【ゾンビ】子は終了したが、親が wait() していない
parent(生存・wait()せず)
│
└─▶ child [Z] <defunct> → PID/テーブルを占有し続ける 🧟
【孤児】親が先に死んだ
parent(exit) ✕
╎ (親不在)
└─▶ child(実行中)
│ reparent(カーネルが付け替え)
▼
init/systemd (PID 1) ──▶ child → init が将来 wait() して回収 👶