web-dev-qa-db-ja.com

Linuxがゾンビプロセスを処理する方法

ゾンビプロセスは、Unix/Linuxシステムで作成されます。 killコマンドで削除できます。

しかし、ゾンビプロセスを処理するLinuxの組み込みのクリーンアップメカニズムはありますか?

12
Atur

ゾンビプロセスはすでに死んでいます。それらを殺すことはできません。 killコマンドまたはシステムコールは、ゾンビプロセスに影響を与えません。 (ゾンビをkillで消すことができますが、後で見るように、ゾンビではなく親を撃たなければなりません。)

ゾンビプロセスは実際にはプロセスではなく、プロセステーブルのエントリにすぎません。ゾンビプロセスに関連付けられている他のリソースはありません。メモリや実行中のコードがなく、開いているファイルを保持していません。

プロセスが停止した場合、他のすべてのリソースがクリーンアップされた後、最後に行うのはプロセステーブルのエントリです。このエントリはゾンビを形成して保持され、親プロセスが子の終了ステータスを追跡できるようにします。親は、システムコールの wait ファミリの1つを呼び出すことにより、終了ステータスを読み取ります。この時点で、ゾンビは消えます。 waitの呼び出しは、子にreapと言われ、ゾンビが死んでいるメタファーを拡張していますが、一部ではまだ完全に来世まで処理されていない方法。親は、気にしないことを示すこともできます(SIGCHLDシグナルを無視するか、_ sigactionSA_NOCLDWAITフラグで呼び出して)。この場合、子が死ぬとすぐにプロセステーブルが削除されます。

したがって、ゾンビが存在するのは、プロセスが死亡し、その親がwaitをまだ呼び出していない場合のみです。この状態が続くのは、親がまだ実行されている間だけです。親が子の前に死ぬか、子のステータスを読み取らずに死ぬ場合、ゾンビの親プロセスはPID 1のプロセスに設定されます initinitの仕事の1つは、ループでwaitを呼び出すことで、その親によって残されたゾンビプロセスを取得します。

ゾンビプロセスはすでに死んでいるので、killしないでください。

ゾンビプロセスは、終了ステータスが収集されるように、親によってwaitedされる必要があります。

Linuxに存在する唯一の「組み込みクリーンアップメカニズム」は、親プロセスが子の終了ステータスを収集する前に停止した場合に機能します。この場合、各子はinitプロセスによって継承され、子プロセスでwaitが終了ステータスを収集して、プロセステーブルからエントリを削除します。

6
chrk

プロセスの親が死ぬとすぐに、プロセスは孤児になります-ゾンビであるかどうかに関係なく。孤児はどうなりますか?彼らはinitという新しい親を取得します。 initは、収集した各孤児でwaitを実行し、孤児を獲得します(これもゾンビだった可能性があります)。

3
Philipp Murry

いいえ、ゾンビ用の組み込みのクリーニングメカニズムはありません。ゾンビは、親が殺されるとゾンビ天国に行きます。それまでは、OSはそれらを保持して終了ステータスを親に返します。

1
unxnut