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

Как посмотреть сервис с несколькими процессами с помощью Monit?

Я пытаюсь посмотреть sympa менеджера списков рассылки с помощью monit. Работающий экземпляр sympa состоит из нескольких процессов для различных задач управления списками (например, отдельный процесс для архивирования электронных писем), но все процессы запускаются / останавливаются с помощью одного сценария инициализации.

В оптимальном случае monit должен предупреждать меня, если какая-либо из служб выходит из строя, а затем перезапускать sympa, но перезапускать ее только один раз. Первое решение выглядело так:

check process sympa
  with pidfile /var/run/sympa/sympa.pid
  start program = "/etc/init.d/sympa start"
  stop program = "/etc/init.d/sympa stop"
check process sympa_bounced
  with pidfile /var/run/sympa/bounced.pid
  start program = "/etc/init.d/sympa start"
  stop program = "/etc/init.d/sympa stop"
check process sympa_bulk
  with pidfile /var/run/sympa/bulk.pid
  start program = "/etc/init.d/sympa start"
  stop program = "/etc/init.d/sympa stop"

Однако, если я остановлю sympa вручную, сценарий инициализации будет выполнен несколько раз, по одному разу для каждой определяемой мной службы (поскольку каждая служба завершилась с ошибкой).

Мой второй подход заключался в определении зависимостей и предупреждении только в случае сбоя какой-либо из подслужб:

check process sympa
  with pidfile /var/run/sympa/sympa.pid
  start program = "/etc/init.d/sympa start"
  stop program = "/etc/init.d/sympa stop"
  depends on sympa_bounced, sympa_bulk
check process sympa_bounced
  with pidfile /var/run/sympa/bounced.pid
  if does not exist then alert
check process sympa_bulk
  with pidfile /var/run/sympa/bulk.pid
  if does not exist then alert

Но так как подуслуги не перезапускаются, основная услуга также не будет перезапущена. Итак, я решил, что могу «подделать» перезапуск, установив start / stop на /bin/true:

check process sympa
  with pidfile /var/run/sympa/sympa.pid
  start program = "/etc/init.d/sympa start"
  stop program = "/etc/init.d/sympa stop"
  depends on sympa_bounced, sympa_bulk
check process sympa_bounced
  with pidfile /var/run/sympa/bounced.pid
  start program = "/bin/true"
  stop program = "/bin/true"
check process sympa_bulk
  with pidfile /var/run/sympa/bulk.pid
  start program = "/bin/true"
  stop program = "/bin/true"

Это тоже не работает, потому что в случае сбоя sympa_bulk файл PID не будет создан до перезапуска службы sympa, и этого не произойдет до того, как sympa_bulk снова запустится.

Есть ли способ контролировать такую ​​службу, получать предупреждающие сообщения для всех подуслуг, но перезапускать службу только один раз, даже если все подуслуги выйдут из строя сразу?

Я нашел два возможных решения. Оба не оптимальны, но работают в моем сценарии:

  1. Для каждой вспомогательной службы только проверяйте, существует ли файл PID, и предполагайте, что служба находится в сети, если файл существует. Как и прежде, основной сервис sympa зависит от подуслуг:

    check process sympa
      with pidfile /var/run/sympa/sympa.pid
      start program = "/etc/init.d/sympa start"
      stop program = "/etc/init.d/sympa stop"
      depends on sympa_bounced, sympa_bulk
    
    check file sympa_bounced
      with path /var/run/sympa/bounced.pid
      if does not exist then restart
    
    check file sympa_bulk
      with path /var/run/sympa/bulk.pid
      if does not exist then restart
    

    restart ничего не делает для файлов, но потому что sympa зависит от подсервисов, он будет перезапущен.

  2. В более новых версиях monit вы также можете выполнить команду и передать ей аргументы:

    check process sympa
      with pidfile /var/run/sympa/sympa.pid
      start program = "/etc/init.d/sympa start"
      stop program = "/etc/init.d/sympa stop"
      depends on sympa_bounced, sympa_bulk
    
    check program sympa_bounced
      with path "/usr/bin/pgrep --pidfile /var/run/sympa/bounced.pid"
      if does not exist then restart
    
    check program sympa_bulk
      with path "/usr/bin/pgrep --pidfile /var/run/sympa/bulk.pid"
      if does not exist then restart
    

    Похожий на check file, то restart действие ничего не делает для программ, но заставляет службу sympa начать заново.

    В более старых версиях монитора (например, 5.4, текущая версия в Debian Wheezy), вы не можете передавать аргументы команде, поэтому вы можете написать простой (однострочный) сценарий для каждой службы, которая выполняет /usr/bin/pgrep с соответствующими аргументами.

С обоими решениями sympa перезапущен один раз если какая-либо из подуслуг выйдет из строя или если sympa вообще не работает.

Вы должны уметь обойти это, используя depends

Так что-то вроде

check process sympa_bulk
  with pidfile /var/run/sympa/bulk.pid
  depends on sympa
  start program = "/bin/true"
  stop program = "/bin/true"