Заставьте монитор дольше ждать, прежде чем считать что-то неработающим.

Вопрос или проблема

Я пытаюсь запустить программу (Resque), но перед записью pid-файла проходит некоторое время. Таким образом, я думаю, что Monit считает, что программа не запустилась, и запускает одну или две дополнительные программы, прежде чем будет записан pid-файл первой.

Как мне задержать время, когда Monit снова проверяет, только для этого процесса? Или мне следует решить это другим способом?

Как мне задержать время, когда Monit снова проверяет, только для этого процесса?


То, что вы пытаетесь достичь, можно сделать с помощью функции “SERVICE POLL TIME” в Monit.

Документация Monit говорит

Сервисы проверяются через регулярные интервалы, заданные в

set daemon n

инструкции. Проверки выполняются в том же порядке, в каком они записаны
в файле .monitrc, за исключением случаев, когда между сервисами установлены зависимости, в этом случае иерархия сервисов может изменять порядок проверок.

Один из методов настройки опроса сервиса – это

  1. пользовательский интервал, основанный на длине цикла опроса.

КАЖДЫЕ [число] ЦИКЛОВ

Пример:

check process resque with pidfile /your/app/root/tmp/pid/resque.pid
   every 2 cycles

Или мне следует решить это другим способом?


Я также делал первоначальную попытку мониторинга заданий resque с помощью monit, потому что monit – это очень легковесный демон, но в конечном итоге я остановился на GOD. Я знаю, знаю, что GOD требует больше ресурсов по сравнению с monit, но в случае resque мы нашли его хорошим вариантом.

Вы можете проверять конкретный сервис с другим интервалом, чем по умолчанию…

Смотрите SERVICE POLL TIME в документации Monit.

Пример для вашей программы Resque будет проверка с другим количеством циклов:

check process resque with pidfile /var/run/resque.pid
   every 5 cycles

или из раздела примеров:

Некоторые серверы медленно стартуют, как, например, серверы приложений на Java. 
Поэтому, если мы хотим поддерживать низкий цикл опроса (т.е. < 60 секунд), но позволить некоторым сервисам занять время на запуск, 
инструкция every будет удобна:

 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

Вы также можете проверить, что что-то не удалось 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'"

Если бамбу (медленно стартующее веб-приложение) не работает в течение 3 минут подряд, перезапустите, НО только если скрипт перезапуска еще не запущен.

Скрипт, который вызывается, имеет заданный период ожидания, который дольше, чем время самого медленного запуска сервиса (в нашем случае мы ожидаем закончить за ~10, поэтому мы спим 15)

#!/bin/bash
echo "Перезапуск бамбу, вызывая init.d"
/etc/init.d/bamboo stop
echo "Остановка завершена, вызываем старт"
/etc/init.d/bamboo start
echo "Завершено перезапуск бамбу, но он будет работать в фоновом режиме некоторое время, прежде чем станет доступен, поэтому мы спим 15 минут"
sleep 900
echo "спать закончилось"

Текущая версия Monit (5.16) поддерживает тайм-аут для скриптов запуска с синтаксисом:

 <START | STOP | RESTART> [PROGRAM] = "program"
    [[AS] UID <число | строка>]
    [[AS] GID <число | строка>]
    [[WITH] TIMEOUT <число> SECOND(S)]

Документация содержит:

В случае проверки процесса Monit будет ждать до 30 секунд, чтобы действие запуска/остановки завершилось, прежде чем сдаться и сообщить об ошибке. Вы можете изменить этот тайм-аут, используя опцию TIMEOUT.

Что и делает значение “timeout”.

Ответ или решение

Чтобы заставить Monit ждать дольше перед тем, как решить, что процесс "мертв", вы можете использовать несколько подходов. Важно делать это с учетом того, что Monit проверяет службы на основе заданного интервала и определенных условий.

Установка пользовательского интервала проверки

Вы можете задавать разные интервалы проверки для отдельных процессов, используя директиву every. Например, для вашего процесса Resque, который может запускаться медленно, вы можете установить более продолжительный интервал проверки. Вот пример конфигурации:

check process resque with pidfile /путь/к/вашему/pid/resque.pid
   every 5 cycles

В этом примере Monit будет проверять наличие файла pid каждые 5 циклов, что уменьшает вероятность перезапуска процесса, пока он еще запускается.

Параметр TIMEOUT для команд запуска

Кроме изменения частоты проверок, вы можете увеличить значение параметра TIMEOUT в вашей команде запуска. Это даст вашему сервису больше времени для запуска. Например:

check process resque with pidfile /путь/к/вашему/pid/resque.pid
   start program = "/путь/к/скрипту/старта" with timeout 90 seconds

В этом случае Monit будет ждать до 90 секунд, прежде чем завершить попытку запуска.

Проверка на повторные сбои

Вы также можете использовать условие для проверки того, сколько раз процесс терпел неудачу подряд, прежде чем начать какие-либо действия. Например:

if failed
    port 80
    for 3 cycles
then alert

Таким образом, если процесс упал 3 раза подряд в течение проверок, он отправит уведомление. Это может помочь отключить лишние перезапуски, если процесс не удается запустить сразу.

Использование промежуточных скриптов

Очередным решением может быть создание промежуточного скрипта, который будет отслеживать, запущен ли процесс уже или нет, чтобы избежать одновременных перезапусков. Например, если Monit уже пытается перезапустить сервис, скрипт будет проверять это и не выполнять повторный запуск в это время.

Пример скрипта:

#!/bin/bash
echo "Перезапускаем resque"
# логика остановки и перезапуска службы
sleep 900  # ожидание завершения старта
echo "Перезапуск завершен"

Эти адаптации могут помочь сделать ваш мониторинг более устойчивым и избежать лишних перезапусков медленно стартующих сервисов. Выберите подходящий вариант или комбинируйте их для достижения наилучшего результата в вашем конкретном случае.

Оцените материал
Добавить комментарий

Капча загружается...