再起動または終了シーケンス中にmonitを使用するときに問題が見つかりました。まず、monitの構成背景を紹介します。
- 監視バージョンは5.5です。
- Monit は inittab で null::respawn:/usr/bin/monit –Ic /etc/monitrc で始まります。
- Monitは30秒ごとにサービスを確認するように構成されています。
- Monitは特定のカスタムアプリケーションを監視し、実行していない場合はその特定のカスタムアプリケーションのinitスクリプトを呼び出して再起動します。
- アプリケーションには、起動時に起動される/etc/init.d/フォルダに独自の初期化スクリプトがあります。 Monitは、inittabでこれらのinitスクリプトが実行された後に開始されます。
これで問題を解決するには、次のようにします。
システムのシャットダウン/再起動中にすべてのサービス監視を停止するには、まずmonitにコマンドを送信します。その後、/etc/init.d/のすべての終了スクリプトが呼び出されます。ほとんどの場合動作しますが、アプリケーションがすでに正常に閉じられているときにmonitがアプリケーションを起動する極端なケースがありますが、これは間違っています。以下のシーケンス図で問題を捉えようとしています。
monitソースコードを見てみると、サービスチェックが失敗した場合は、monitが上記のコマンドを分岐して実行しようとしているようです。したがって、monitがunmonitorコマンドを受け取ると、分岐プロセスが続行される可能性があります。 monitは、このコマンドを受け取ったときに開始されたプロセスを停止せずにすぐに返すようです。
monitによって開始されたすべてのサブプロセスが完了するのを待つ方法はありますか?
この問題を回避するための他の提案はありますか?