web-dev-qa-db-ja.com

Monitで複数のプロセスを持つサービスを監視する方法は?

メーリングリストマネージャー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回だけ再起動する方法はありますか?

3
morxa

私が見つけた2つの可能な解決策があります。どちらも最適ではありませんが、私のシナリオでは機能します。

  1. すべてのサブサービスについて、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はサブサービスに依存しているため、再起動されます。

  2. 新しい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

4
morxa

あなたはdependsを使ってそれを回避できるはずです

だから何かのような

check process sympa_bulk
  with pidfile /var/run/sympa/bulk.pid
  depends on sympa
  start program = "/bin/true"
  stop program = "/bin/true"
0
Mike