それで最近、ランダムにクラッシュして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 ]
は入力を取得せず、したがって何もしません。
とにかくこのスクリプトを修正/修正して、私がやりたいことをすることができますか?それとも、私はここから軌道を外れているのでしょうか?
ありがとう!
ゾンビプロセスである場合、reboot
である必要はありません。その理由は次のとおりです。
プロセスが終了すると、プロセスはゾンビになりますが、その親は戻りコードを取得するためにwait(2)
を呼び出していません
ゾンビは、カーネルのプロセステーブルのエントリのみを除き、物理リソースまたは仮想リソースを使用しません。
親がwait(2)
を呼び出すと、ゾンビが適切に刈り取られ、プロセステーブルエントリが削除されます
ゾンビが孤児になった場合、つまり親が死んだ場合、init
(PID 1)はプロセスを継承し、wait(2)
を呼び出してそれを収獲します。
ご覧のとおり、wait(2)
が呼び出されてゾンビが刈り取られるまでは時間の問題です。時間の経過とともに多くのゾンビがいる場合、それはプログラミングの欠陥であると考えてください。reboot
ingではなく、コードの修正(または修正を求める)を検討する必要があります。
ゾンビプロセスを見つけるには、プロセスのSTATE
を取得します。Z
の場合、プロセスはゾンビです。
ps -eo pid,ppid,state,cmd | awk '$3=="Z"'
ここでは、選択フィールド、つまりPID、PPID、STATE、およびCOMMANDのみを取得しています。