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