プログラム(Resque)を起動しようとしていますが、pidfileが書き込まれるまでに少し時間がかかります。したがって、Monitはプログラムが開始されていないと考え、最初のプログラムのpidfileが書き込まれる前に、1つまたは2つのプログラムを開始すると思います。
このプロセスのためだけに、Monitがチェックする時間を遅らせるにはどうすればよいですか?それとも別の方法で解決する必要がありますか?
このプロセスのために、Monitがチェックする時間をどのように遅らせるのですか?
達成しようとしていることは、monitの「SERVICE POLL TIME」機能を介して実行できます
モニターのドキュメントは言う
サービスは、によって与えられた定期的な間隔でチェックされます
set daemon n
ステートメント。チェックは、サービス間に依存関係が設定されている場合を除いて、.monitrcファイルに記述されているのと同じ順序で実行されます。
サービスポーリングをカスタマイズする方法の1つは、
すべて[番号]サイクル
例:
check process resque with pidfile /your/app/root/tmp/pid/resque.pid
every 2 cycles
または別の方法でこれを解決する必要がありますか?
Monitは非常に軽量なデーモンですが、最終的にはGODで解決されるため、monitでresqueジョブを監視する最初の試みも行いました。私は知っています。GODはmonitに比べてリソースを多く消費しますが、resqueの場合、それは良い一致であることがわかりました。
デフォルトとは異なる間隔で特定のサービスをチェックできます...
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
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'
( ここから )
私のチームのメンバーは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"
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オプションを使用してオーバーライドできます。
これは「タイムアウト」値が行うことです。