Назад | Перейти на главную страницу

Почему Monit выполняет действия по неопределенным циклам?

Я использую Monit 5.5 с CHECK PROGRAM директива для выполнения внешнего скрипта, который выполняет некоторую работу для проверки правильности работы моего приложения. Я хочу выполнять эту проверку каждые несколько циклов, чтобы не перегружать приложение. Моя конфигурация такова:

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 сбой подряд
Действие: нет

Цикл 2
Результат проверки: 2 последовательных отказа
Действие: перезапуск (выполняется первое условие)

Цикл 3
Результат проверки: 3 последовательных отказа
Действие: перезапуск (первое условие все еще выполняется, последние два цикла завершились со статусом = 1)

Цикл 4
Результат проверки: 4 последовательных отказа
Действие: перезапустите И exec / bin / true (выполняются первое и второе условия)

Цикл 5
Результат проверки: 5 последовательных отказов
Действие: перезапустите И exec / bin / true (первое и второе условия по-прежнему выполняются)

Поскольку ваша программа всегда возвращает 1, первое условие всегда будет выполняться после результата проверки во втором цикле, поскольку (по крайней мере) последние 2 цикла всегда будут терпеть неудачу, пока вы не отключите мониторинг.