PIDファイル、cron、その他の子ではないプロセスを評価しようとするものは避けてください。
UNIXで子供を待つことしかできないのには、十分な理由があります。回避しようとするメソッド(ps解析、pgrep、PIDの保存など)には欠陥があり、ギャップホールがあります。ノーと言うだけ。
代わりに、プロセスを監視するプロセスがプロセスの親になる必要があります。これは何を意味するのでしょうか?つまり、プロセスを開始するプロセスだけが、プロセスの終了を確実に待つことができます。bashでは、これは絶対に取るに足らないことです。
until myserver; do
echo "Server 'myserver' crashed with exit code $?. Respawning.." >&2
sleep 1
done
上記のbashコードはループで実行さmyserver
れuntil
ます。最初の行が開始されmyserver
、終了するまで待機します。終了すると、until
終了ステータスをチェックします。終了ステータスがの場合、0
正常に終了したことを意味します(つまり、何らかの方法でシャットダウンするように要求したところ、正常にシャットダウンしました)。その場合は、再起動したくありません(シャットダウンするように要求しただけです!)。終了状態である場合にはない 0
、until
stderrにエラーメッセージを発するとループ(ライン1に戻る)を再起動ループ本体、実行され、1秒後に。
なぜ私たちは一秒待つのですか?起動シーケンスに問題があり、myserver
すぐにクラッシュする場合は、常に再起動してクラッシュするという非常に集中的なループが発生するためです。はそれsleep 1
から緊張を取り除きます。
これで、必要なのはこのbashスクリプトを(おそらく非同期で)開始するだけでありmyserver
、必要に応じて監視および再起動します。起動時にモニターを起動する(サーバーを「再起動」させる)場合は、@reboot
ルールを使用してユーザーのcron(1)でモニターをスケジュールできます。cronルールを開きますcrontab
。
crontab -e
次に、監視スクリプトを開始するルールを追加します。
@reboot /usr/local/bin/myservermonitor
あるいは; inittab(5)と/ etc / inittabを見てください。そこに行を追加myserver
して、特定の初期化レベルで開始し、自動的にリスポーンさせることができます。
編集。
PIDファイルを使用しない理由についていくつか情報を追加しましょう。彼らは非常に人気がありますが、また、これらには非常に欠陥があり、正しい方法で実行しない理由はありません。
このことを考慮:
PIDリサイクル(間違ったプロセスを強制終了):
/etc/init.d/foo start
:開始してfoo
、にfoo
PIDを書き込みます/var/run/foo.pid
- しばらくして、
foo
どういうわけか死ぬ。
- しばらくして:開始する(それを呼び出す
bar
)ランダムプロセスはランダムなPIDを受け取りfoo
ます。古いPID を受け取ることを想像してください。
- あなたは
foo
なくなっていることに気づきます:/etc/init.d/foo/restart
読み取り/var/run/foo.pid
、それがまだ生きているかどうかを確認し、見つけbar
、それを考え、それfoo
を殺し、新しいものを開始しfoo
ます。
PIDファイルが古くなります。PIDファイルが古くなっているかどうかを確認するには、過度に複雑な(つまり、自明ではない)ロジックが必要であり、そのようなロジックはに対して脆弱1.
です。
書き込みアクセス権がない場合や、読み取り専用環境にいる場合はどうなりますか?
それは無意味な複雑化です。上記の私の例がいかに単純かを見てください。それを複雑にする必要はまったくありません。
参照:PIDファイルは、「正しく」実行した場合でも欠陥がありますか?
ところで; PIDファイルよりもさらに悪いのは解析ps
です! これを行わないでください。
ps
非常に移植性がありません。ほとんどすべてのUNIXシステムで見つかりますが、非標準出力が必要な場合、その引数は大きく異なります。また、標準出力は人間が使用するためのものであり、スクリプトによる解析のためのものではありません。
- 解析
ps
すると、多くの誤検知が発生します。テイクps aux | grep PID
例を、そして今、あなたとあなたのデーモンを見つめていたPIDと同じであることを起こる引数として数値どこかでプロセスを開始する人を想像してみてください。2人のユーザーがXセッションを開始し、Xを求めて自分のセッションを殺すことを想像してください。それはすべての種類の悪いです。
プロセスを自分で管理したくない場合。プロセスのモニターとして機能する完全に優れたシステムがいくつかあります。たとえばrunitを調べます。