为什么 Monit 会按照未指定的周期执行操作?

为什么 Monit 会按照未指定的周期执行操作?

我正在使用 Monit 5.5 和CHECK PROGRAM指令来执行外部脚本,该脚本会做一些工作来验证我的应用程序是否正常运行。我想每隔几个周期进行一次此检查,以避免给应用程序带来负担。我的配置如下:

CHECK program mydaemon with path "/usr/local/sbin/my_check.sh"
  ALERT [email protected] 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秒。

答案1

Monit 完全按照您的指示运行。

让我们分解一下逻辑:

第 1 周期
检查结果:1次连续失败
措施:无

第 2 周期
检查结果:连续2次失败
操作:重新启动(满足第一个条件)

第 3 周期
检查结果:连续 3 次失败
操作:重新启动(第一个条件仍然满足,最后两个循环以状态 = 1 退出)

第四周期
检查结果:连续4次失败
操作:重启AND exec /bin/true(第一和第二个条件都满足)

第 5 周期
检查结果:连续5次失败
操作:重新启动AND exec /bin/true(第一和第二个条件仍然满足)

由于您的程序始终返回 1,因此在第二个循环的检查结果之后,第一个条件将始终得到满足,因为(至少)最后 2 个循环将始终失败,直到您取消监控。

相关内容