1

プログラムを監視するためにmonitを使用しています。監視されているプログラムは、2 つの状況でクラッシュする可能性があります

  • プログラムがランダムにクラッシュする可能性があります。再起動するしかない
  • 悪い状態になり、その後起動するたびにクラッシュします

後者の状況を修正するために、プログラムを停止し、データ ファイルを消去して適切な状態にリセットし、再起動するスクリプトを作成しました。以下の構成を試しました

check process program with pidfile program.pid
start program = "programStart" as uid username and gid groupname
stop program = "programStop" as uid username and gid groupname
if 3 restarts within 20 cycles then exec "cleanProgramAndRestart" as uid username and gid groupname
if 6 restarts within 20 cycles then timeout

monit がプログラムを 3 サイクルで 3 回再起動するとします。3 回目の再起動後、cleanProgramAndRestartスクリプトが実行されます。しかし、cleanProgramAndRestart スクリプトが再びプログラムを再起動すると、次のサイクルで 3 回の再起動の条件が再び満たされ、無限ループになります。

誰でもこれを修正する方法を提案できますか?

以下のアクションのいずれかが可能な場合、回避策がある可能性があります。

  • 「再起動」の代わりに「クラッシュ」キーワードがある場合、プログラムが 3 回再起動された後ではなく、3 回クラッシュした後にクリーン スクリプトを実行できます
  • 実行スクリプトの実行後に何らかの方法で「再起動」カウンターをリセットする方法がある場合
  • 条件3の再起動の出力が変わった場合のみ何かを実行する方法があれば
4

1 に答える 1

2

Monit は、サイクルごとに「テスト」をポーリングしています。サイクルの長さは、通常、/etc/monitrcで定義されます。set daemon cycle_length

したがって、cleanProgramAndRestart実行に 1 サイクルもかからない場合は、発生しないはずです。cleanProgramAndRestartそれが起こっているので、実行するのに1サイクル以上かかると思います。

あなたはできる:

  • モニター構成でサイクル長を増やします
  • プログラムを x サイクルごとにチェックします (cycle_length*x > cleanProgramAndRestart_length であることを確認してください)

これらの変数を変更できない場合は、一時ファイルを使用して少し回避策がある可能性があります。

check process program 
  with pidfile program.pid
  start program = "programStart" 
    as uid username and gid groupname
  stop program = "programStop" 
    as uid username and gid groupname
  if 3 restarts within 20 cycles 
  then exec "touch /tmp/program__is_crashed" 
  if 6 restarts within 20 cycles then timeout

check file program_crash with path /tmp/program_crash every x cycles #(make sure that cycle_length*x > cleanProgramAndRestart_length)
  if changed timestamp then exec "cleanProgramAndRestart"
    as uid username and gid groupname
于 2013-09-26T17:56:55.823 に答える