Как посмотреть сервис с несколькими процессами с 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.

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

2 ответа

Решение

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

  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 Заново.

    С более старыми версиями Monit (например, 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"
Другие вопросы по тегам