web-dev-qa-db-ja.com

何かが死んだと考える前に、monitをより長く待機させる

プログラム(Resque)を起動しようとしていますが、pidfileが書き込まれるまでに少し時間がかかります。したがって、Monitはプログラムが開始されていないと考え、最初のプログラムのpidfileが書き込まれる前に、1つまたは2つのプログラムを開始すると思います。

このプロセスのためだけに、Monitがチェックする時間を遅らせるにはどうすればよいですか?それとも別の方法で解決する必要がありますか?

20
Ramon Tayag

このプロセスのために、Monitがチェックする時間をどのように遅らせるのですか?


達成しようとしていることは、monitの「SERVICE POLL TIME」機能を介して実行できます

モニターのドキュメントは言う

サービスは、によって与えられた定期的な間隔でチェックされます

set daemon n

ステートメント。チェックは、サービス間に依存関係が設定されている場合を除いて、.monitrcファイルに記述されているのと同じ順序で実行されます。

サービスポーリングをカスタマイズする方法の1つは、

  1. ポーリングサイクルの長さの倍数に基づくカスタム間隔

すべて[番号]サイクル

例:

check process resque with pidfile /your/app/root/tmp/pid/resque.pid
   every 2 cycles

または別の方法でこれを解決する必要がありますか?


Monitは非常に軽量なデーモンですが、最終的にはGODで解決されるため、monitでresqueジョブを監視する最初の試みも行いました。私は知っています。GODはmonitに比べてリソースを多く消費しますが、resqueの場合、それは良い一致であることがわかりました。

10
kaji

デフォルトとは異なる間隔で特定のサービスをチェックできます...

Monitドキュメントの SERVICE POLL TIME を参照してください。

Resqueプログラムの例は、異なるサイクル数をチェックすることです。

check process resque with pidfile /var/run/resque.pid
   every 5 cycles

または例のセクションから:

Some servers are slow starters, like for example Java based Application Servers. 
So if we want to keep the poll-cycle low (i.e. < 60 seconds) but allow some services to take its time to start, 
the every statement is handy:

 check process dynamo with pidfile /etc/dynamo.pid every 2 cycles
       start program = "/etc/init.d/dynamo start"
       stop program  = "/etc/init.d/dynamo stop"
       if failed port 8840 then alert

または、cronスタイルのチェックを活用できます。

check process resque with pidfile /var/run/resque.pid
   every 10 * * * *

または、起動が遅い場合は、service startコマンドでタイムアウトを延長できます。

check process Apache with pidfile /var/run/httpd.pid
       start program = "/etc/init.d/httpd start" with timeout 90 seconds
19
ewwhite

X回続けて何かが失敗したかどうかを確認することもできます。

 if failed 
    port 80 
    for 10 cycles 
 then alert

または、Y回の投票でX回の場合:

 if failed 
    port 80
    for 3 times within 5 cycles 
 then alert

または両方:

 check filesystem rootfs with path /dev/hda1
  if space usage > 80% for 5 times within 15 cycles then alert
  if space usage > 90% for 5 cycles then exec '/try/to/free/the/space'

ここから

9
Vaiden

私のチームのメンバーはmonitが頻繁(毎分)にチェックできるというかなり賢い解決策を考え出しましたが、一度サービスを再起動しようとすると(〜10分かかります)指定された猶予期間待ってから、再開を試みます

これにより、チェック間の待ち時間が長くなりすぎないようにします。スロースタートと組み合わせると、顧客への影響がはるかに大きくなります。フラグとして機能する中間スクリプトを使用して機能し、monitが最後の障害からすでにアクションを実行していることを示します。

check Host bamboo with address bamboo.mysite.com
   if failed
           port 443 type tcpSSL protocol http
           and status = 200
           and request /about.action
            for 3 cycles
   then exec "/bin/bash -c 'ps -ef | grep -v "$$" | grep -v "grep" | grep restartBamboo.sh >/dev/null 2>&1; if [ $? -ne 0 ]; then /opt/monit/scripts/restartBamboo.sh; fi'"

竹(遅い起動のWebアプリ)が3分間連続して停止した場合は、再起動します。ただし、再起動スクリプトがまだ実行されていない場合のみです。

呼び出されたスクリプトには、サービスの開始時間が最も遅くなるまで待機する指定のスリープがあります(この場合、〜10で完了すると予想されるため、15秒間スリープします)。

#!/bin/bash
echo "Retarting bambo by calling init.d"
/etc/init.d/bamboo stop
echo "Stopped completed, calling start"
/etc/init.d/bamboo start
echo "Done restarting bamboo, but it will run in background for sometime before available so, we are sleeping for 15 minutes"
sleep 900
echo "done sleeping"
2
Eddie

Monitの現在のバージョン(5.16)は、次の構文で起動スクリプトのタイムアウトをサポートしています。

 <START | STOP | RESTART> [PROGRAM] = "program"
    [[AS] UID <number | string>]
    [[AS] GID <number | string>]
    [[WITH] TIMEOUT <number> SECOND(S)]

docs 状態:

プロセスチェックの場合、Monitは開始/停止アクションが終了するまで最大30秒待機してから、中止してエラーを報告します。このタイムアウトは、TIMEOUTオプションを使用してオーバーライドできます。

これは「タイムアウト」値が行うことです。

2
jeteon