ゾンビプロセスは、Unix/Linuxシステムで作成されます。 kill
コマンドで削除できます。
しかし、ゾンビプロセスを処理するLinuxの組み込みのクリーンアップメカニズムはありますか?
ゾンビプロセスはすでに死んでいます。それらを殺すことはできません。 kill
コマンドまたはシステムコールは、ゾンビプロセスに影響を与えません。 (ゾンビをkill
で消すことができますが、後で見るように、ゾンビではなく親を撃たなければなりません。)
ゾンビプロセスは実際にはプロセスではなく、プロセステーブルのエントリにすぎません。ゾンビプロセスに関連付けられている他のリソースはありません。メモリや実行中のコードがなく、開いているファイルを保持していません。
プロセスが停止した場合、他のすべてのリソースがクリーンアップされた後、最後に行うのはプロセステーブルのエントリです。このエントリはゾンビを形成して保持され、親プロセスが子の終了ステータスを追跡できるようにします。親は、システムコールの wait
ファミリの1つを呼び出すことにより、終了ステータスを読み取ります。この時点で、ゾンビは消えます。 wait
の呼び出しは、子にreapと言われ、ゾンビが死んでいるメタファーを拡張していますが、一部ではまだ完全に来世まで処理されていない方法。親は、気にしないことを示すこともできます(SIGCHLDシグナルを無視するか、_ sigaction
をSA_NOCLDWAIT
フラグで呼び出して)。この場合、子が死ぬとすぐにプロセステーブルが削除されます。
したがって、ゾンビが存在するのは、プロセスが死亡し、その親がwait
をまだ呼び出していない場合のみです。この状態が続くのは、親がまだ実行されている間だけです。親が子の前に死ぬか、子のステータスを読み取らずに死ぬ場合、ゾンビの親プロセスはPID 1のプロセスに設定されます init
。 init
の仕事の1つは、ループでwait
を呼び出すことで、その親によって残されたゾンビプロセスを取得します。
ゾンビプロセスはすでに死んでいるので、kill
しないでください。
ゾンビプロセスは、終了ステータスが収集されるように、親によってwait
edされる必要があります。
Linuxに存在する唯一の「組み込みクリーンアップメカニズム」は、親プロセスが子の終了ステータスを収集する前に停止した場合に機能します。この場合、各子はinit
プロセスによって継承され、子プロセスでwait
が終了ステータスを収集して、プロセステーブルからエントリを削除します。
プロセスの親が死ぬとすぐに、プロセスは孤児になります-ゾンビであるかどうかに関係なく。孤児はどうなりますか?彼らはinit
という新しい親を取得します。 init
は、収集した各孤児でwait
を実行し、孤児を獲得します(これもゾンビだった可能性があります)。
いいえ、ゾンビ用の組み込みのクリーニングメカニズムはありません。ゾンビは、親が殺されるとゾンビ天国に行きます。それまでは、OSはそれらを保持して終了ステータスを親に返します。