web-dev-qa-db-ja.com

プロセステーブルからゾンビプロセスを削除する

私は、initによって採用される厄介なゾンビプロセスを持っていますが、それは消えません。ダミープロセスを作成し、ゾンビをその新しいプロセスの子としてアタッチし、それをthen killしてプロセステーブルから削除する方法があることを読みました。

正確にはどうすればいいですか?

そして、はい、私はこれのほとんどを読みました:

ゾンビプロセスはすでに終了しているため、強制終了できません。

または

システムを再起動するだけです

そして

ゾンビプロセスはリソースを使用しないため、そのまま使用する必要があります

残念ながら、多くのプログラムはプロセステーブルをチェックして、インスタンスがすでに実行されているかどうかを確認し、プロセステーブルにエントリがある場合、新しいインスタンスの開始を拒否します。

そして、私のSSHFS接続が切断されるたびに再起動し、それにSublimeを使用することは、ちょっとばかげています。

8
skerit

ゾンビを取り除くonly方法は、その親をwait()にして、終了ステータスを報告できるようにすることです。これを行うには、親が適切に記述されていると想定して、SIGCHLDを親に送信します。

ゾンビがいる場合、通常は親が[〜#〜]ではない[〜#〜]正しく記述されている(子が死亡してゾンビになったときに、子はすでにSIGCHLDを親に送信したため)、次のステップは親を殺すことです。
pstree(_-p_オプションを使用)などのツールを使用すると、ゾンビの系統を表示して、どのプロセスが親であるかを知ることができます。
親が死ぬとき、ゾンビはinitによって採用されます。これは常に子供が死ぬためにwait() ingであり、採用するすべてのゾンビを喜んで殺します。

親プロセスが実際にinit(PID 1)である場合は、決して発生してはならない状況にあります。 SIGCHLDinitに送信してみることもできますが、実際にそれを行う必要はありません。それでも問題が解決しない場合は、システムのinitが壊れていて、ジョブを実行していないため、再起動するしかありません。

(これらは「ショットガン」オプションです。)


親プロセスの強制終了を回避したい場合、一部の 私よりもクリエイティブな人 もこのオプションを考え出しました。

  1. ゾンビと親プロセスのPIDSを特定する
    (この例では、ゾンビがPID 3101で、親がPID 3100であるとしましょう)
  2. gdbattachを親に起動します。
    _attach 3100_
  3. ゾンビのwaitpidを呼び出します。
    call waitpid(3101,0,0)
  4. 親(detach)からデタッチし、デバッガーを終了します。

(これは細かく調整された狙撃ライフルです。)

16
voretaq7

なぜゾンビのプロセスが心配なのですか?それらが拘束し続けるリソースは最小限です(スケルトン構造タスク、PIDのためのスペースなど、それ以外はあまりありません)。確かに見た目は悪いですが、それだけです。両親を探して修正し、より良い代替案(他の有益な副作用がある可能性があります)に置き換え、バグとして報告します(確かにそうです)。

0
vonbrand