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


8

私は、initによって採用される迷惑なゾンビプロセスを持っています。私は新しいプロセスの子としてゾンビを添付して、ダミーのプロセスを作成する方法があります読んだ後、プロセス・テーブルから削除、それを殺します。

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

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

ゾンビプロセスはすでに死んでいるので、殺すことはできません。

または

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

そして

ゾンビプロセスはリソースを使用しません。

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

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


7
...ショットガンで。;)
ネイサンC

+1、メインを見て「ゾンビを殺す」を見たので
HopelessN00b

回答:


16

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

ゾンビがいる場合、それは通常、親が適切に書かれていないことを意味します(子SIGCHLDが死亡してゾンビになったときに親に送信されたため)、次のステップは親を殺すことです。(オプション付き)
などのツールを使用すると、ゾンビの系統を表示して、どのプロセスが親であるかを知ることができます。 親が死ぬとき、ゾンビはによって養子に入れられます。これは常に子供が死ぬことであり、養子縁組するすべてのゾンビを喜んで殺します。pstree-p
initwait()

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

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


いくつかの私はより多くのクリエイティブな人々あなたが親プロセスを殺す避けたい場合も、このオプションが出ています。

  1. ゾンビと親プロセスのPIDSを決定します
    (この例では、ゾンビがPID 3101で、親がPID 3100であるとしましょう)
  2. アップ火災gdbattach親へ:
    attach 3100
  3. waitpidゾンビを呼びます:
    call waitpid(3101,0,0)
  4. 親から切り離し(detach)、デバッガーを終了します。

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


1
ええ、素晴らしい答え。「モシン」ライフルがすぐそこにあります。
Danila Ladner、2014

1
@DanilaLadnerクレジットを獲得できればいいのですが、Googleの小さなハントを使って「ダミープロセスの子としてゾンビをアタッチする」ことについてスケルトが何を意味するかを確認するまで、デバッガーを使用waitpid()して私に発生しないように強制するという考えがありました。私はひどい元プログラマーです...
voretaq7 14

call waitpid二度と戻らない
deFreitas '16 / 10/17

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.