【みなしごプロセス】

孤児プロセス とは?

💡 親がいなくなった迷子のプロセス、でもinitおじさんがちゃんと引き取ってくれる
📌 このページのポイント
孤児プロセスとゾンビプロセスの違い 孤児プロセス 親(終了済) 子(実行中) reparent init (PID 1) が新しい親に ゾンビプロセス 親(実行中) 子(終了済) 状態: Z 親が wait() を 呼ばない → 残骸が残る PIDを占有し続ける 特徴: まだ生きている 親が先に終了 → 子は動き続ける init が引き取るので基本問題なし 特徴: もう死んでいる 子が先に終了 → 親が回収しない 大量発生するとPID枯渇の原因に
孤児プロセスとゾンビプロセスの違い
ひよこ ひよこ

孤児プロセスって、ゾンビプロセスとは違うの?

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

全然違うよ。ゾンビは「子が先に死んで親が回収していない」状態で、孤児は「親が先に死んで子が取り残された」状態なんだ。ゾンビはすでに実行が終わっているけど、孤児はまだ元気に動いているプロセスだよ

ひよこ ひよこ

親がいなくなった子プロセスはどうなるの?

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

Linuxではinitプロセス(PID 1、最近のシステムではsystemd)が自動的に新しい親になってくれるんだ。「養子縁組」みたいなもので、reparenting(再ペアレンティング)と呼ばれるよ。だから孤児プロセスは放置しても基本的に問題ないんだ

ひよこ ひよこ

孤児プロセスが問題になることはあるの?

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

意図しない孤児プロセスが大量に残ると、CPUやメモリを無駄に使い続けることがあるね。たとえばスクリプトが子プロセスを起動したまま異常終了すると、子プロセスがバックグラウンドで動き続けてリソースを消費するんだ

ひよこ ひよこ

わざと孤児にすることってあるの?

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

あるよ!デーモン(常駐プロセス)を作るときの古典的なテクニックで「ダブルフォーク」というのがある。親が fork() して、子がさらに fork() して、中間の子を終了させることで孫を意図的に孤児化させるんだ。こうするとinitが親になって、ターミナルを閉じてもプロセスが動き続ける。今はsystemdデーモン管理をしてくれるからこのテクニックを使う場面は減ったけど、仕組みを知っていると理解が深まるよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「孤児プロセス」って出てきたら「親が先に終了して取り残された子プロセス」と思えればだいたいOK!
📖 おまけ:英語の意味
「orphan process」 = 孤児プロセス
💬 orphan(孤児)のプロセスで、親を失った子プロセスを人間の孤児にたとえた名前だよ
← 用語集にもどる