web-dev-qa-db-ja.com

ゾンビプロセスを見つけるためのBashスクリプト?

それで最近、ランダムにクラッシュしてPPIDが1(init)のゾンビになるプロセスがあることに気付きました。これを修正する唯一の方法は、PCを再起動することだと言われました(または、SIGCHLDをinitに送信します。

基本的に、私がやろうとしているのは、ゾンビプロセスを探して、もしあれば、PCを再起動するbashスクリプトを書くことです。

現在、私はこのスクリプトを使用してプロセス自体を監視しています:

 ps auxw | grep ethminer | grep -v grep > /dev/null

 if [ $? != 0 ]
 then
    Sudo reboot
 fi

現在、ethminerが実行中または実行されていない場合、このスクリプトは正常に動作するようです。プロセステーブルにethminerが表示されない場合はマシンを再起動し、表示されない場合は何もしません。

ただし、プロセスがゾンビになったときに終了コードが存在しないため、if [ $? != 0 ]は入力を取得せず、したがって何もしません。

とにかくこのスクリプトを修正/修正して、私がやりたいことをすることができますか?それとも、私はここから軌道を外れているのでしょうか?

ありがとう!

3
cannabeatz

ゾンビプロセスである場合、rebootである必要はありません。その理由は次のとおりです。

  • プロセスが終了すると、プロセスはゾンビになりますが、その親は戻りコードを取得するためにwait(2)を呼び出していません

  • ゾンビは、カーネルのプロセステーブルのエントリのみを除き、物理リソースまたは仮想リソースを使用しません。

  • 親がwait(2)を呼び出すと、ゾンビが適切に刈り取られ、プロセステーブルエントリが削除されます

  • ゾンビが孤児になった場合、つまり親が死んだ場合、init(PID 1)はプロセスを継承し、wait(2)を呼び出してそれを収獲します。

ご覧のとおり、wait(2)が呼び出されてゾンビが刈り取られるまでは時間の問題です。時間の経過とともに多くのゾンビがいる場合、それはプログラミングの欠陥であると考えてください。rebootingではなく、コードの修正(または修正を求める)を検討する必要があります。


ゾンビプロセスを見つけるには、プロセスのSTATEを取得します。Zの場合、プロセスはゾンビです。

ps -eo pid,ppid,state,cmd | awk '$3=="Z"'

ここでは、選択フィールド、つまりPID、PPID、STATE、およびCOMMANDのみを取得しています。

5
heemayl