Monit
為什麼 Monit 在未指定的周期上執行操作?
我正在使用帶有
CHECK PROGRAM
指令的 Monit 5.5 來執行一個外部腳本,該腳本可以驗證我的應用程序是否正常執行。我想每隔幾個週期進行一次檢查,以避免成為應用程序的負擔。我的配置是這樣的:CHECK program mydaemon with path "/usr/local/sbin/my_check.sh" ALERT monit@mycompany.pagerduty.com ON { exec } START PROGRAM "/etc/init.d/mydaemon start" STOP PROGRAM "/etc/init.d/mydaemon stop" if status = 1 for 2 cycles then restart # Trick monit into doing a restart + hitting our local alert if status = 1 for 4 cycles then exec "/bin/true" if status = 1 for 6 cycles then unmonitor every 3 cycles
事情幾乎按預期工作 - 每 3 個週期 monit 執行檢查或採取行動,儘管您可能通過配置中的註釋猜到,我在日誌中看到的是在周期 3、4 和 5 monit 也會執行重啟操作:
May 24 14:03:24 monit[19488]: 'mydaemon' status failed (1) for /usr/local/sbin/my_check.sh -- Error: testing! May 24 14:03:54 monit[19488]: 'mydaemon' status failed (1) for /usr/local/sbin/my_check.sh -- Error: testing! May 24 14:03:54 monit[19488]: 'mydaemon' trying to restart May 24 14:03:54 monit[19488]: 'mydaemon' stop: /etc/init.d/mydaemon May 24 14:03:54 monit[19488]: 'mydaemon' start: /etc/init.d/mydaemon May 24 14:04:24 monit[19488]: 'mydaemon' status failed (1) for /usr/local/sbin/my_check.sh -- Error: testing! May 24 14:04:24 monit[19488]: 'mydaemon' trying to restart May 24 14:04:24 monit[19488]: 'mydaemon' stop: /etc/init.d/mydaemon May 24 14:04:24 monit[19488]: 'mydaemon' start: /etc/init.d/mydaemon May 24 14:04:54 monit[19488]: 'mydaemon' status failed (1) for /usr/local/sbin/my_check.sh -- Error: testing! May 24 14:04:54 monit[19488]: 'mydaemon' status failed (1) for /usr/local/sbin/my_check.sh -- Error: testing! May 24 14:04:54 monit[19488]: 'mydaemon' exec: /bin/true May 24 14:04:54 monit[19488]: 'mydaemon' status failed (1) for /usr/local/sbin/my_check.sh -- Error: testing! May 24 14:04:54 monit[19488]: 'mydaemon' trying to restart May 24 14:04:54 monit[19488]: 'mydaemon' stop: /etc/init.d/mydaemon May 24 14:04:54 monit[19488]: 'mydaemon' start: /etc/init.d/mydaemon May 24 14:05:25 monit[19488]: 'mydaemon' status failed (1) for /usr/local/sbin/my_check.sh -- Error: testing! May 24 14:05:25 monit[19488]: 'mydaemon' status failed (1) for /usr/local/sbin/my_check.sh -- Error: testing! May 24 14:05:25 monit[19488]: 'mydaemon' exec: /bin/true May 24 14:05:25 monit[19488]: 'mydaemon' status failed (1) for /usr/local/sbin/my_check.sh -- Error: testing! May 24 14:05:25 monit[19488]: 'mydaemon' trying to restart May 24 14:05:25 monit[19488]: 'mydaemon' stop: /etc/init.d/mydaemon May 24 14:05:25 monit[19488]: 'mydaemon' start: /etc/init.d/mydaemon
為什麼 monit
restart
在未指定的周期上執行我的操作?PS - 我的監控週期長度是 10 秒,因此日誌片段中的操作相隔 30 秒。
Monit 完全按照您的指示行事。
讓我們分解一下邏輯:
週期 1
檢查結果:1 次連續失敗
措施:無
Cycle 2
檢查結果:連續2次失敗
動作:重啟(滿足第一個條件)
Cycle 3
檢查結果:連續 3 次失敗
Action:重啟(第一個條件仍然滿足,最後兩個循環以 status = 1 退出)
Cycle 4
檢查結果:連續4次失敗
Action:restart AND exec /bin/true(第一個和第二個條件都滿足)
Cycle 5
檢查結果:連續5次失敗
Action:restart AND exec /bin/true (仍然滿足第一個和第二個條件)
由於您的程序始終返回 1,因此在第二個週期的檢查結果之後始終會滿足第一個條件,因為(至少)最後兩個週期將始終失敗,直到您取消監控。