Monit

為什麼 Monit 在未指定的周期上執行操作?

  • May 27, 2013

我正在使用帶有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

為什麼 monitrestart在未指定的周期上執行我的操作?

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,因此在第二個週期的檢查結果之後始終會滿足第一個條件,因為(至少)最後兩個週期將始終失敗,直到您取消監控。

引用自:https://serverfault.com/questions/510603