プログラム(Resque)を起動しようとしていますが、pidfileが書き込まれるまでに少し時間がかかります。したがって、Monitは、プログラムが開始されていないと考え、最初のプログラムのpidfileが書き込まれる前に、1つまたは2つのプログラムをさらに開始すると思います。
このプロセスのために、Monitが再びチェックする時間を遅らせるにはどうすればよいですか?または、これを別の方法で解決する必要がありますか?
プログラム(Resque)を起動しようとしていますが、pidfileが書き込まれるまでに少し時間がかかります。したがって、Monitは、プログラムが開始されていないと考え、最初のプログラムのpidfileが書き込まれる前に、1つまたは2つのプログラムをさらに開始すると思います。
このプロセスのために、Monitが再びチェックする時間を遅らせるにはどうすればよいですか?または、これを別の方法で解決する必要がありますか?
回答:
このプロセスのために、Monitが再びチェックする時間を遅らせるにはどうすればよいですか?
あなたが達成しようとしていることは、monitの「サービスポーリング時間」機能を介して行うことができます
Monitのドキュメントによると
サービスは、
set daemon n
ステートメント。チェックは、サービス間に依存関係が設定されている場合を除き、.monitrcファイルに書き込まれたのと同じ順序で実行されます。その場合、サービス階層はチェックの順序を変更する場合があります。
サービスポーリングをカスタマイズする方法の1つは
すべての[number]サイクル
例:
check process resque with pidfile /your/app/root/tmp/pid/resque.pid
every 2 cycles
または、これを別の方法で解決する必要がありますか?
monitは非常に軽量なデーモンですが、最終的にはGODで解決するため、最初にmonitを使用してレスクジョブを監視しようとしました。私は知っている、私は神がmonitと比較してより多くのリソースを必要とすることを知っているが、resqueの場合にはそれが良いマッチであることがわかった。
デフォルトとは異なる間隔で特定のサービスを確認できます...
Monitのドキュメントの「サービスのポーリング時間」を参照してください。
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
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が頻繁に(1分ごとに)チェックできるようにするかなり賢いソリューションを思い付きましたが、サービスを再起動しようとすると(〜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'"
bamboo(スロースタート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)]
ドキュメントの状態:
プロセスチェックの場合、Monitは開始/停止アクションが終了するまで最大30秒待機してから、givingめてエラーを報告します。TIMEOUTオプションを使用して、このタイムアウトをオーバーライドできます。
これが「タイムアウト」値の機能です。
timeout
は、起動と再起動の両方に適用されます。私の知る限り、Monitがa)実行中、b)予想されるPIDファイルが作成され、c)予想されるPIDのプロセスが現在実行されていることを確認するまでに遅延が発生します。指定されたアプリケーションが実際のプロセスを分岐したスクリプトであり、プロセスで何が起こっているのか知らずに戻ってきた場合、動作させるためにいくつかの問題がありました。この場合、動作させるのは苦痛でした。
START DELAY
いるかもしれないと信じています。