
私は持っているmonit
プロセスのペアが CPU を大量に消費した場合にそのプロセスを終了するように構成されていますが、どちらかが終了すると、monit summary
OS がプロセスを再起動した後でも、プロセスに対して「監視されていません」と報告されます。
再起動後にプロセスを「監視」するように設定するにはどうすればよいですか?
check process soagent
matching "soagent"
stop program = "/usr/bin/pkill -9 soagent"
if cpu > 20% for 1 cycles then stop
if cpu > 20% for 1 cycles then alert
check process callservicesd
matching "callservicesd"
stop program = "/usr/bin/pkill -9 callservicesd"
if cpu > 20% for 1 cycles then stop
if cpu > 20% for 1 cycles then alert
macOS 10.13.4、モニター5.25.2
答え1
問題は、プロセスを停止するように指示しているだけなので、監視も停止してしまうことです。
この場合、最も簡単な解決策は、launchd にプロセスを再起動するように指示するスクリプトを作成し (残念ながら、macOS についてはあまり詳しくないので、具体的にはサポートできません)、次に、各サービスの monit 構成で単一の条件を使用して、次のようにスクリプトを実行することです。
if cpu > 20% for 1 cycles then exec "/path/to/script"
このexec
句はトリガーされると電子メールアラートを送信し、スクリプトを実行してプロセス/サービスを再起動させます。その後、監視を停止するように指示されていないため、monit は監視を続けます。
このアプローチを採用すると仮定すると、サービス上でstop program
実行しない限り使用されないため、定義から行を削除することもできます。monit stop
さらに明確にするために編集します:
Monitは、OSがプロセス監視を担当していないと想定しています。言い換えれば、プロセスの開始と停止の責任はOSのみにあると想定しており、そのため、何かを停止するように指示すると、そのプロセスとそして再起動を試みるものは何もないと想定しているため、監視を停止します (そのため、macOS の launchd や Linux の systemd で使用すると、時々少し面倒になります)。
あなたの場合、必要なのは、処理能力を使いすぎた場合にプロセスを再起動し、そのことを知らせることです。monit でこれを行うには、次の 2 つの方法があります。
start program
およびを定義しますstop program
。これは、別のプロセス スーパーバイザを init システムとして使用する場合 (macOS ではそうします)、プログラムを開始または停止するように指示するコマンドである必要があります。次に、条件が発生した場合にプロセスを再起動するように monit に指示し、アラートを取得する条件を追加します。macOS では、launchctl
再起動を処理するコマンドが必要です。これは推奨される「正しい」方法ですが、作業launchctl
が少し面倒です (誰もサービスを手動で再起動したくないと想定しているようです)。そのため、この方法はお勧めしません。再起動をトリガーするスクリプトを作成し、そのスクリプトへのパスを
exec
条件のアクションとして指定します。monitexec
の現在のバージョンでは、アクションによって暗黙的にアラートが送信されるため、この場合はアラート条件を指定する必要はありません。この場合、最初のサービスに対する「スクリプト」は次のようになります。#!/bin/bash /usr/bin/pkill -9 soaagent
そして、2 番目も同様です。必要なのは、何らかの方法で launchd をトリガーしてサービスを再起動することだけです。サービス自体を再起動する必要はありません。本質的に、このアプローチは、上で試みているのと同じように、monit に再起動をトリガーするように指示するだけです。必要な結果が得られるように、少しクリーンな方法でそれを実行します。