Я использую Monit для мониторинга различных процессов, которые необходимо запустить и запустить. как группа для правильной работы веб-сайта. Чтобы вызвать или отключить сайт, существует определенный порядок, в котором процессы должны быть запущены или остановлены. Зависимости следующие. (Имена были изменены, чтобы защитить невиновных. Я использую более описательные имена в реальной конфигурации.)
Сервис site
зависит от site.workerA
, site.workerB
и site-redis
.
Оба работника зависят от site-redis
.
Сайт всегда запускается или останавливается через Monit, чтобы избежать возможных условий гонки, или Monit работает против меня. (например, я останавливаю службу, а Monit продолжает ее запускать.)
Проблема в том, что для запуска всего сайта требуется гораздо больше времени, чем необходимо. Если я проинструктирую Monit запустить сайт, то после того, как Monit определит зависимости, последовательность действий со стороны Monit будет такой:
site-redis
.site-redis
работает, поэтому запустите двух рабочих.site
.site
это работает.]Я заключил в скобки последние два шага, потому что они практически не обсуждаются, поскольку сайт фактически запущен и работает до последнего двухминутного интервала.
Двухминутный спящий режим - это интервал опроса по умолчанию, который Monit использует для проверки служб. Я знаю, что могу уменьшить этот интервал, чтобы эти службы всегда опрошены чаще. Например, я мог бы сделать
check process site.workerB pidfile "/srv/site/var/run/site/site.workerB.pid"
every [number] cycles
...
Мне также пришлось бы изменить длину цикла опроса на что-то меньшее, чтобы цикл составлял менее 2 минут.
Однако я не хочу, чтобы Монит всегда чаще опрашивайте эти службы. Я бы хотел, чтобы Monit чаще опрашивал службы только тогда, когда находится в процессе ожидания изменения состояния. Скажем, если Monit запустил службу, и от нее зависит другая служба, опросите с интервалом в 5 секунд, а не с 2 минутами.
Я не вижу возможности настроить Monit для этого, но, возможно, я что-то пропустил.
Вот иллюстрация к описанию моей прозы выше. После удаления вещей, которые не имеют отношения к проблеме, конфигурация Monit будет такой:
check process site-redis pidfile ".../site/redis.pid"
group site
start program = ...
stop program = ...
if does not exist then start
check process site pidfile ".../site/site.pid"
group site
depends on site.workerA, site.workerB, site-redis
start program = ...
stop program = ...
if does not exist then start
check process site.workerA pidfile ".../site/site.workerA.pid"
group site
depends on site-redis
start program = ...
stop program = ...
if does not exist then start
check process site.workerB pidfile ".../site/site.workerB.pid"
group site
depends on site-redis
start program = ...
stop program = ...
if does not exist then start
Фактически вы можете инициировать повторную оценку мониторинга, monit validate
или SIGUSR1
.
Таким образом, вы можете переписать свои программы запуска / остановки на:
#!/bin/bash
function background {
i="0"
while [ $i -lt 20 ]; do
monit validate > /dev/null
monit status __YOUR__SERVICE__NAME__HERE__ | grep OK > /dev/null && exit 0
sleep 5
i=$[$i+1]
done
}
# restart procedure
state=$?
background &
exit $state
Короче говоря: после завершения процедуры перезапуска отслеживается ее код выхода и запускается фоновый цикл. Он запускается 20 раз и спит по 5 секунд после каждого запуска (~ 1 мин 40 с). Он заставляет monit переоценивать свое состояние и выходит из цикла, если состояние OK
. Если нет, цикл продолжается. Наконец, сам сценарий завершается с кодом выхода процедуры перезапуска.