web-dev-qa-db-ja.com

ゾンビプロセスとは何ですか?

topやGUIベースのSystem Monitorなどのコマンドを使用すると、現時点でいくつかのゾンビプロセスがあることがわかります。

ゾンビプロセスとは何ですか?

それらは、ゾンビになっているシステムまたはアプリケーションのパフォーマンスに影響しますか?使用しているメモリが多すぎますか、それともメモリを使用しますか?

138
Jesper

ゾンビは死んだプロセスです。彼らは「殺す」ことはできません(DEADを殺すことはできません)。すべてのプロセスは最終的に死に、それらが実行されるとゾンビになります。彼らはリソースをほとんど消費しませんが、それは彼らが死んでいるからです!ゾンビの理由は、ゾンビの親(プロセス)がゾンビの終了ステータスとリソース使用統計を取得できるようにするためです。親は、wait()システムコールの1つを使用して、オペレーティングシステムにゾンビが不要になったことを通知します。

プロセスが停止すると、その子プロセスはすべてプロセス番号1の子になります。これはinitプロセスです。 Initは「常に」子供が死ぬのを待っているので、子供がゾンビとして残ることはありません。

ゾンビプロセスがある場合、それらのゾンビが親によって待機されていないことを意味します(ps -lで表示されるPPIDを見てください)。 3つの選択肢があります。親プロセスを修正します(待機させます)。親を殺します。またはそれと一緒に暮らす。ゾンビはpsの出力で余分な行を1つ以上占有するため、それと一緒に暮らすことはそれほど難しくないことを覚えておいてください。

ゾンビは、STAT列に「Z」が存在することで、Unixのpsコマンドからの出力で識別できます。短期間以上存在するゾンビは、通常、親プログラムのバグを示しています。他のリークと同様に、いくつかのゾンビの存在自体は気になりませんが、より重い負荷の下で深刻になる問題を示している可能性があります。

システムからゾンビを削除するには、killコマンドを使用して、SIGCHLDシグナルを手動で親に送信できます。親プロセスがゾンビの刈り取りを拒否する場合、次のステップは親プロセスを削除することです。プロセスが親を失うと、initはその新しい親になります。 Initはwaitシステムコールを定期的に実行して、initを親として使用するゾンビを獲得します。

親プロセスが終了または終了したコンピュータープロセスである孤立プロセスもあります。

サーバーの要求を行った後にクライアントプロセスがクラッシュすると、リモート呼び出し中にプロセスが孤立する可能性があります。

孤児はサーバーリソースを浪費し、サーバーをトラブルに巻き込む可能性があります(これはゾンビと孤児の最大のリソースの違いです(ただし、孤児ゾンビムービーを見る場合を除きます)。しかし、孤児プロセスの問題にはいくつかの解決策があります。

  1. 駆除は、最も一般的に使用される手法です。この場合、孤立プロセスは強制終了されます。

  2. 生まれ変わりは、マシンが定期的にリモート計算の親を見つけようとする手法です。その時点で、孤立プロセスが強制終了されます。

  3. 有効期限は、各プロセスが強制終了されるまでに一定の時間を割り当てる手法です。必要に応じて、割り当てられた時間が経過する前にプロセスが終了するまでの時間を「求める」ことができます。

プロセスは、親プロセスと同じマシン上で実行される親なしにすることもできます。 UNIXライクなオペレーティングシステムでは、孤立したプロセスは特別な「init」システムプロセスによって直ちに採用されます。この操作は再ペアレント化と呼ばれ、自動的に実行されます。技術的にはプロセスの親として「init」プロセスがありますが、元々プロセスを作成したプロセスが存在しないため、親プロセスと呼ばれます。

詳細:

http://wiki.answers.com/Q/What_is_Zombie_Process_and_Orphan_Process#ixzz1PCN9voj

http://www.linuxsa.org.au/tips/zombies.html

http://www.brighthub.com/computing/linux/articles/79186.aspx

システムがハングし、ユーザー入力にゆっくり反応する場合、ハングしているプロセスを特定して強制終了する方法?

LANにあるWindowsマシンからUbuntuマシンで実行中のプロセスをリモートでキルする

162
Luis Alvarado

ゾンビプロセス(<defunct>としても表示)は、実際のプロセスではありません。これらは、カーネルプロセステーブルの単なるエントリです。これは、彼らが消費する唯一のリソースです。 CPUやRAMを消費しません。ゾンビがいる唯一の危険は、プロセステーブルのスペースが不足していることです(cat /proc/sys/kernel/threads-maxを使用して、システムで許可されているエントリの数を確認できます)。

それらは、親プロセス(つまり、fork()'edそれらのプロセス)が生きているときにのみ表示されますが、wait()システム関数をまだ呼び出していません。親が死ぬと、ゾンビはwait()'ed for initになり、消えます。

20
vartec

child processが終了すると、親が何らかの適切なアクションを実行できるように、その死が親に通知されます。

親が戻りコードを受け入れるのを待つであるprocessは、ゾンビプロセスと呼ばれます。

completed their executionがありますが、process tableにはentryがあります。

7
Prateek Joshi

ゾンビプロセスは実行を停止したプロセスですが、親プロセスが待機syscallを介して取得していないため、プロセステーブルエントリはまだ存在しています。技術的には、終了する各プロセスは非常に短い期間ゾンビですが、より長く生きることができます。

子プロセスが終了した後、親プロセスがwait syscallを呼び出さない場合、より長く存続するゾンビプロセスが発生します。これが発生する1つの状況は、親プロセスの記述が不十分で、待機呼び出しを単純に省略した場合、または親プロセスが子の前に終了し、新しい親プロセスが待機を呼び出していない場合です。プロセスの親が子の前に死ぬと、OSは子プロセスを「init」プロセスまたはPID 1に割り当てます。つまり、initプロセスは子プロセスを「採用」し、その親になります。これは、子プロセスが終了すると新しい親(init)がwaitを呼び出して終了コードを取得するか、プロセステーブルエントリが永久に残りゾンビになることを意味します

1
Ijaz Ahmad Khan