⭐️ゾンビプロセスと孤児プロセス

  • ゾンビプロセス(正式名称: 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() して回収 👶