私は、initによって採用される厄介なゾンビプロセスを持っていますが、それは消えません。ダミープロセスを作成し、ゾンビをその新しいプロセスの子としてアタッチし、それをthen killしてプロセステーブルから削除する方法があることを読みました。
正確にはどうすればいいですか?
そして、はい、私はこれのほとんどを読みました:
ゾンビプロセスはすでに終了しているため、強制終了できません。
または
システムを再起動するだけです
そして
ゾンビプロセスはリソースを使用しないため、そのまま使用する必要があります
残念ながら、多くのプログラムはプロセステーブルをチェックして、インスタンスがすでに実行されているかどうかを確認し、プロセステーブルにエントリがある場合、新しいインスタンスの開始を拒否します。
そして、私のSSHFS接続が切断されるたびに再起動し、それにSublimeを使用することは、ちょっとばかげています。
ゾンビを取り除くonly方法は、その親をwait()
にして、終了ステータスを報告できるようにすることです。これを行うには、親が適切に記述されていると想定して、SIGCHLD
を親に送信します。
ゾンビがいる場合、通常は親が[〜#〜]ではない[〜#〜]正しく記述されている(子が死亡してゾンビになったときに、子はすでにSIGCHLD
を親に送信したため)、次のステップは親を殺すことです。pstree
(_-p
_オプションを使用)などのツールを使用すると、ゾンビの系統を表示して、どのプロセスが親であるかを知ることができます。
親が死ぬとき、ゾンビはinit
によって採用されます。これは常に子供が死ぬためにwait()
ingであり、採用するすべてのゾンビを喜んで殺します。
親プロセスが実際にinit
(PID 1)である場合は、決して発生してはならない状況にあります。 SIGCHLD
をinit
に送信してみることもできますが、実際にそれを行う必要はありません。それでも問題が解決しない場合は、システムのinit
が壊れていて、ジョブを実行していないため、再起動するしかありません。
(これらは「ショットガン」オプションです。)
親プロセスの強制終了を回避したい場合、一部の 私よりもクリエイティブな人 もこのオプションを考え出しました。
gdb
とattach
を親に起動します。attach 3100
_waitpid
を呼び出します。call waitpid(3101,0,0)
detach
)からデタッチし、デバッガーを終了します。(これは細かく調整された狙撃ライフルです。)
なぜゾンビのプロセスが心配なのですか?それらが拘束し続けるリソースは最小限です(スケルトン構造タスク、PIDのためのスペースなど、それ以外はあまりありません)。確かに見た目は悪いですが、それだけです。両親を探して修正し、より良い代替案(他の有益な副作用がある可能性があります)に置き換え、バグとして報告します(確かにそうです)。