Я пытаюсь запустить программу (Resque), но до записи pidfile требуется некоторое время. Таким образом, я думаю, что Monit считает, что программа еще не запущена, и запускает еще одну или две программы до того, как будет записан pid-файл первой.
Как мне отложить повторную проверку Monit только для этого процесса? Или я должен решить это по-другому?
Вы можете проверить конкретную услугу с интервалом, отличным от интервала по умолчанию ...
Видеть ВРЕМЯ ОПРОСА ОБСЛУЖИВАНИЯ в документации Monit.
Примером для вашей программы Resque будет проверка другого количества циклов:
check process resque with pidfile /var/run/resque.pid
every 5 cycles
или из раздела примеров:
Some servers are slow starters, like for example Java based Application Servers.
So if we want to keep the poll-cycle low (i.e. < 60 seconds) but allow some services to take its time to start,
the every statement is handy:
check process dynamo with pidfile /etc/dynamo.pid every 2 cycles
start program = "/etc/init.d/dynamo start"
stop program = "/etc/init.d/dynamo stop"
if failed port 8840 then alert
или вы можете использовать проверки в стиле cron.
check process resque with pidfile /var/run/resque.pid
every 10 * * * *
или если у вас медленный запуск, вы можете увеличить время ожидания в команде запуска службы:
check process apache with pidfile /var/run/httpd.pid
start program = "/etc/init.d/httpd start" with timeout 90 seconds
Как мне отложить повторную проверку Monit только для этого процесса?
То, чего вы пытаетесь достичь, можно сделать с помощью "ВРЕМЯ ОПРОСА ОБСЛУЖИВАНИЯ"особенность монитора
В документации Monit говорится
Услуги проверяются через регулярные промежутки времени, указанные
set daemon n
заявление. Проверки выполняются в том же порядке, в каком они записаны в файле .monitrc, за исключением случаев, когда между службами установлены зависимости, и в этом случае иерархия служб может менять порядок проверок.
Один из способов настройки опроса службы -
КАЖДЫЙ [номер] ЦИКЛ
Пример:
check process resque with pidfile /your/app/root/tmp/pid/resque.pid
every 2 cycles
Или я должен решить это по-другому?
Я также предпринял первоначальную попытку контролировать задания восстановления с помощью monit, потому что monit - очень легкий демон, но в конечном итоге остановился на GOD. Я знаю, я знаю, что БОГ более требователен к ресурсам по сравнению с монитором, но в случае восстановления мы обнаружили, что это хорошее совпадение.
Вы также можете проверить, не удалось ли что-то X раз подряд:
if failed
port 80
for 10 cycles
then alert
Или для X раз в Y опросах:
if failed
port 80
for 3 times within 5 cycles
then alert
Или оба:
check filesystem rootfs with path /dev/hda1
if space usage > 80% for 5 times within 15 cycles then alert
if space usage > 90% for 5 cycles then exec '/try/to/free/the/space'
(отсюда)
Член моей команды придумал довольно умное решение, которое позволяет monit проверять часто (каждую минуту), но после попытки перезапуска службы (что занимает ~ 10 минут) он будет ждать указанный период отсрочки перед повторной попыткой запуска.
Это предотвращает слишком долгое ожидание между проверками, что в сочетании с медленным запуском оказывает гораздо большее влияние на клиентов. Он работает с использованием промежуточного сценария, который действует как флаг, указывающий, что monit уже предпринимает действия с момента последнего сбоя.
check host bamboo with address bamboo.mysite.com
if failed
port 443 type tcpSSL protocol http
and status = 200
and request /about.action
for 3 cycles
then exec "/bin/bash -c 'ps -ef | grep -v "$$" | grep -v "grep" | grep restartBamboo.sh >/dev/null 2>&1; if [ $? -ne 0 ]; then /opt/monit/scripts/restartBamboo.sh; fi'"
Если bamboo (медленное запускаемое веб-приложение) не работает в течение 3 минут подряд, перезапустите, НО только если сценарий перезапуска еще не запущен.
Вызываемый скрипт имеет указанный спящий режим, который ожидает ДЛИННЕ, чем самое медленное время запуска службы (в нашем случае мы ожидаем завершения через ~ 10, поэтому мы спим 15)
#!/bin/bash
echo "Retarting bambo by calling init.d"
/etc/init.d/bamboo stop
echo "Stopped completed, calling start"
/etc/init.d/bamboo start
echo "Done restarting bamboo, but it will run in background for sometime before available so, we are sleeping for 15 minutes"
sleep 900
echo "done sleeping"
Текущая версия Monit (5.16) поддерживает тайм-аут для сценариев запуска с синтаксисом:
<START | STOP | RESTART> [PROGRAM] = "program"
[[AS] UID <number | string>]
[[AS] GID <number | string>]
[[WITH] TIMEOUT <number> SECOND(S)]
В документы штат:
В случае проверки процесса Monit будет ждать до 30 секунд завершения действия запуска / остановки, прежде чем отказаться и сообщить об ошибке. Вы можете отменить этот тайм-аут, используя параметр TIMEOUT.
Это то, что делает значение «тайм-аут».