回答:
ああ、神様!ダメダメダメ。kill -9を使用しないでください。
プロセスにきれいな機会を与えません:
ソケット接続をシャットダウンする
一時ファイルをクリーンアップします
それがなくなることをその子供に通知します
端末の特性などをリセットします。
一般に、15を送信し、1〜2秒待機し、それが機能しない場合は2を送信し、それが機能しない場合は1を送信します。
kill -9を使用しないでください。植木鉢をきれいにするためだけにコンバインを出さないでください。
ゾンビプロセス(実際には<defunct>
)は実際にはプロセスではありません。プロセステーブル内の唯一のエントリなので、親プロセスはwait()
syscallを実行できます。
心配する必要はありません。それらはリソースを占有せずwait()
、親が死んだときに親が呼び出したときに消えます。
ゾンビプロセスには、プロセスツリーのエントリ以外のリソースは一切割り当てられません。これは、プロセスが完了したときに発生しますが、親プロセスはまだそれを取得していません(つまり、wait
edで処理されています)。
必要に応じkill -20
て、親にSIGCHLD()を送信することで、親に強制的にこれを実行させることができますが、親がそれを尊重する保証はありません。
多くの場合、短時間表示されます(たとえば、topを使用してプロセスツリーを表示しているとき)-これは正常です。子プロセスが完了してから親がポーリングするまでのタイムスライスでは、子プロセスはゾンビとして表示されます。
ただし、継続的に存在するゾンビプロセスが見られる場合(これは正常ではありません)-デッドプロセスにリソースが割り当てられていないため、心配する必要はありません-これは一般的に、アプリケーションが粗末な開発者によって不十分に書かれていることを意味します。
ゾンビプロセスに注意する必要があるのは、たとえば、上記の同じくだらないアプリケーションに負荷がかかっている場合など、たくさんのプロセスを見るときだけです。
私には多くの安っぽい開発者がいますので、そのような問題に対処し、その間にあらゆる種類の役に立たないことを学ぶ特権があります。実際、私のチームは、インタビューでくだらない開発者によって書かれたくだらないシェルスクリプトを使用することにしばしば頼ります-候補者がスクリプトが本当にくだらないことを選択し、それがくだらない理由を教えてくれるなら、彼はドアに足を踏み入れています。
仮想ショットガンについては...
$ shoot <pid>
#!/ bin / sh 犠牲者= `ps -e -o pid、ppid | egrep "^ \ s * $ 1 \ b" | awk '{print $ 2}' ` 犠牲者\ _name = `ps -e -o pid、cmd | egrep "^ \ s * $ {victim} \ b" | head -n 1 | awk '{print $ 2}' ` #kill $ {victim} echo "殺された$ {victim_name}。"
そして覚えておいてください:常に頭の中でそれらを撃ちます。