メーリングリストマネージャーsympaをmonitで監視しようとしています。実行中のsympaインスタンスは、リスト管理のさまざまなタスク用の複数のプロセス(たとえば、電子メールをアーカイブするための個別のプロセス)で構成されますが、すべてのプロセスは単一のinitスクリプトで開始/停止されます。
最適には、monitは、サービスのいずれかが失敗した場合に警告を表示してsympaを再起動しますが、再起動は1回だけです。最初の解決策は次のようになりました。
check process sympa
with pidfile /var/run/sympa/sympa.pid
start program = "/etc/init.d/sympa start"
stop program = "/etc/init.d/sympa stop"
check process sympa_bounced
with pidfile /var/run/sympa/bounced.pid
start program = "/etc/init.d/sympa start"
stop program = "/etc/init.d/sympa stop"
check process sympa_bulk
with pidfile /var/run/sympa/bulk.pid
start program = "/etc/init.d/sympa start"
stop program = "/etc/init.d/sympa stop"
ただし、sympaを手動で停止すると、initスクリプトは、定義するすべてのサービスに対して1回(すべてのサービスが失敗したため)、複数回実行されます。
2番目のアプローチは、依存関係を定義し、サブサービスのいずれかが失敗した場合にのみ警告することでした。
check process sympa
with pidfile /var/run/sympa/sympa.pid
start program = "/etc/init.d/sympa start"
stop program = "/etc/init.d/sympa stop"
depends on sympa_bounced, sympa_bulk
check process sympa_bounced
with pidfile /var/run/sympa/bounced.pid
if does not exist then alert
check process sympa_bulk
with pidfile /var/run/sympa/bulk.pid
if does not exist then alert
ただし、サブサービスは再起動されないため、メインサービスも再起動されません。したがって、start/stopを/bin/true
に設定することで、再起動を「偽造」できると考えました。
check process sympa
with pidfile /var/run/sympa/sympa.pid
start program = "/etc/init.d/sympa start"
stop program = "/etc/init.d/sympa stop"
depends on sympa_bounced, sympa_bulk
check process sympa_bounced
with pidfile /var/run/sympa/bounced.pid
start program = "/bin/true"
stop program = "/bin/true"
check process sympa_bulk
with pidfile /var/run/sympa/bulk.pid
start program = "/bin/true"
stop program = "/bin/true"
Sympa_bulkに障害が発生した場合、sympaサービスが再起動される前にPIDファイルが作成されず、sympa_bulkが再度実行される前にこれが発生しないため、これも機能しません。
そのようなサービスを監視し、すべてのサブサービスのアラートメッセージを取得し、すべてのサブサービスが一度に失敗した場合でも、サービスを1回だけ再起動する方法はありますか?
私が見つけた2つの可能な解決策があります。どちらも最適ではありませんが、私のシナリオでは機能します。
すべてのサブサービスについて、PIDファイルが存在するかどうかのみを確認し、ファイルが存在する場合はサービスがオンラインであると想定します。以前と同様に、メインサービスsympa
はサブサービスに依存します。
check process sympa
with pidfile /var/run/sympa/sympa.pid
start program = "/etc/init.d/sympa start"
stop program = "/etc/init.d/sympa stop"
depends on sympa_bounced, sympa_bulk
check file sympa_bounced
with path /var/run/sympa/bounced.pid
if does not exist then restart
check file sympa_bulk
with path /var/run/sympa/bulk.pid
if does not exist then restart
restart
はファイルに対しては何もしませんが、sympa
はサブサービスに依存しているため、再起動されます。
新しいmonitバージョンでは、コマンドを実行して、コマンドに引数を渡すこともできます。
check process sympa
with pidfile /var/run/sympa/sympa.pid
start program = "/etc/init.d/sympa start"
stop program = "/etc/init.d/sympa stop"
depends on sympa_bounced, sympa_bulk
check program sympa_bounced
with path "/usr/bin/pgrep --pidfile /var/run/sympa/bounced.pid"
if does not exist then restart
check program sympa_bulk
with path "/usr/bin/pgrep --pidfile /var/run/sympa/bulk.pid"
if does not exist then restart
check file
と同様に、restart
アクションはプログラムに対して何も実行しませんが、サービスsympa
を強制的に再起動します。
古いモニターバージョン(例:5.4
、Debian Wheezyの現在のバージョン)では、引数をコマンドに渡すことができないため、/usr/bin/pgrep
を実行する各サービスに対してシンプルな(1行の)スクリプトを記述できます。それぞれの引数で。
どちらのソリューションでも、サブサービスのいずれかが失敗した場合、またはsympa
がまったく実行されていない場合、sympa
が再起動されますonce。
あなたはdepends
を使ってそれを回避できるはずです
だから何かのような
check process sympa_bulk
with pidfile /var/run/sympa/bulk.pid
depends on sympa
start program = "/bin/true"
stop program = "/bin/true"