заставить monit сначала предупредить, а потом перезапустить

Я хотел бы обработать своего рода цепное действие в monit.

  • проверить процесс и немедленно предупредить.
  • перезапустить процесс после определенного количества циклов.

Мои попытки (пока):

check process myprocess with pidfile /run/my.pid
  start program = "/path/to/binary start" with timeout 60 seconds
  stop program = "/path/to/binary stop" with timeout 60 seconds
  if not exist for 3 cycles then restart
  if not exist then alert
  if 3 restarts within 3 cycles then timeout

Не предупреждает и остается в состоянии «работает» при сбое PID, но перезапускается после 3 циклов.

check process myprocess with pidfile /run/my.pid
  start program = "/path/to/binary start" with timeout 60 seconds
  stop program = "/path/to/binary stop" with timeout 60 seconds
  if not exist for 3 cycles then restart
  if children < 1 for 1 cycles then alert
  if 3 restarts within 3 cycles then timeout

Нет предупреждений о дочерних элементах ‹ 1, но перезапустите после 5.

monit.log

[CEST Aug  1 15:09:30] error    : 'myprocess' process is not running

сводка монитора

Process 'myprocess'            Running

Вот часть ist monit -v:

Existence      = if does not exist 3 times within 3 cycle(s) then restart else 
                 if succeeded 1 times within 1 cycle(s) then alert
Pid            = if changed 1 times within 1 cycle(s) then alert
Ppid           = if changed 1 times within 1 cycle(s) then alert
Children       = if less than 1 1 times within 1 cycle(s) then alert else if 
                 succeeded 1 times within 1 cycle(s) then alert
Timeout        = If restarted 3 times within 3 cycle(s) then unmonitor

Итак, вопрос: можно ли отправить оповещение и изменить статус на «не работает» в течение 1 цикла и перезапустить через 3?


person questioner    schedule 01.08.2014    source источник
comment
Когда вы говорите, что не предупреждает, вы имеете в виду, что вы настроили глобальные/локальные оповещения по электронной почте для Monit, и он не отправляет их соответствующим образом?   -  person Eduardo López    schedule 26.10.2015
comment
monit настроен правильно. все оповещения и электронные письма в порядке. Как я уже писал, monit вообще не предупреждает и продолжает работать при сбое PID, но перезапускается после 3 циклов.   -  person questioner    schedule 10.07.2018


Ответы (1)


ИЗМЕНИТЬ (ВАЖНО): см. комментарии ниже для более новых (по состоянию на февраль 2019 г.) версий Monit, в которых это поведение было улучшено.


Эта строка:

if does not exist for 3 cycles then restart

Означает следующее:

Не выполняйте никаких действий, пока не проверите 3 раза, что служба не существует, затем перезапустите ее. Это поведение описано в документации monit как отказоустойчивость:

ОТКАЗОУСТОЙЧИВОСТЬ

По умолчанию действие выполняется, если оно совпадает и служба находится в состоянии ошибки. Однако вы можете потребовать, чтобы тест провалился более одного раза, прежде чем возникнет событие ошибки и состояние службы изменится на «сбой». Это полезно, чтобы избежать предупреждений о ложных ошибках, которые могут произойти, особенно при тестировании сети.

Синтаксис:

ДЛЯ ЦИКЛОВ ... или:

[TIMES IN] ЦИКЛЫ ...

Соответственно, Monit не изменит статус службы, пока она не выйдет из строя в течение следующих X циклов. Для того, чтобы подтвердить это утверждение, просто снимите отказоустойчивость для этого сервиса и используйте только:

if does not exist then alert

вручную остановить службу и подтвердить, что команда

monit status

теперь показывает статус «Не существует», как только вы его остановите.

Итак, вернемся к вашим вопросам:

  1. Да, можно отправить оповещение (по электронной почте) в течение 1 цикла. Для этого вам нужно определить опцию «если не существует, то предупредить» для этой службы и правильно настроить оповещения по электронной почте. Предполагая, что вы хотите использовать внешний сервер электронной почты, вам необходимо определить как минимум две строки (пример конфигурации с gmail):

КОНФИГУРАЦИЯ SMTP-СЕРВЕРА

set mailserver smtp.gmail.com PORT 587 USERNAME "[email protected]" PASSWORD "xxxxx" using TLSV1 with timeout 30 seconds

(Имейте в виду, что в Gmail вы должны активировать доступ для «незащищенных» приложений, чтобы разрешить monit использовать службу stmp)

и

ПОЛУЧАТЕЛЬ ЭЛЕКТРОННОЙ ПОЧТЫ

set alert [email protected]

оба в файле /etc/monit/monitrc. Обратитесь к официальной документации для получения дополнительной информации об этих двух строках.

  1. Насколько говорит документация, невозможно сразу обновить статус службы, если определена отказоустойчивость (выполнять действие через X циклов). Но вы по-прежнему можете настроить немедленную отправку предупреждений и перезапустить службу в течение желаемых циклов.

Использованная литература:

Документация Monit: https://mmonit.com/monit/documentation/monit.html

Надеюсь, поможет!

С Уважением

person Eduardo López    schedule 27.10.2015
comment
Может ли кто-нибудь объяснить мне, почему люди голосуют против этого ответа? о_О - person Eduardo López; 19.01.2016
comment
Пожалуйста, взгляните на первую конфигурацию. Там я пробовал, если не существует, то предупреждение безрезультатно. - person questioner; 10.07.2018
comment
Я только что провел несколько тестов с последней версией monit (5.25.2), и похоже, что они избавились от отказоустойчивости. Насколько я могу проверить, статус процесса теперь меняется сразу после первого цикла, вы можете определить, если не существует в течение 3 циклов, затем перезапустите, а если не существует, то предупредите вместе, и он действительно работает так, как предполагалось (предупреждения от первый цикл и перезапускается в третьем). Я бы посоветовал обновиться до последней версии и посмотреть, работает ли ваша конфигурация. Если это так, я бы обновил ответ. - person Eduardo López; 28.09.2018
comment
Нет, они не избавились от отказоустойчивости. Вместо этого теперь он называется Fault Tolerance и выглядит почти так же, как и раньше, но в любом случае поведение теперь отличается, и статус процесса изменяется после первого цикла ошибки, а не в конце указанных циклов, поэтому он действительно должен работать, как вы ожидали. Опять же, попробуйте обновить и поделиться :-) - person Eduardo López; 28.09.2018