Как посмотреть сервис с несколькими процессами с 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 ответа
Есть два возможных решения, которые я нашел. Оба не оптимальны, но работают в моем сценарии:
Для каждой подсервисной службы проверьте только, существует ли файл 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
в зависимости от вспомогательных служб, он будет перезапущен.В более новых версиях 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"