Заставьте monit ждать дольше, прежде чем думать, что что-то мертво

20

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

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

Рамон Тайаг
источник
Я добавил новый ответ ниже. Хотя более длительное ожидание между проверками предотвратит конфликты для медленных сервисов, это может быть очень плохим опытом для клиентов.
Эдди

Ответы:

10

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


То, чего вы пытаетесь достичь, можно сделать с помощью функции monit « SERVICE POLL TIME »

В документации Monit говорится

Услуги регулярно проверяются

set daemon n

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

Один из способов настроить опрос

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

КАЖДЫЙ [номер] ЦИКЛОВ

Пример:

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

Или я должен решить это по-другому?


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

кажи
источник
Благодарность! Я заканчивал тем, что использовал каждые x циклов. Я только что нашел номер, который работал на меня.
Рамон Тайаг
19

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

См. ВРЕМЯ ОБСЛУЖИВАНИЯ ОБСЛУЖИВАНИЯ в документации 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
ewwhite
источник
Тот же ответ, верно?
ewwhite
2
with timeout 90 secondsбыло именно то, что я хотел. Благодарю.
Андрей
1
Престижность за включение таймаутов и cron-стиля. Это самый точный и полный ответ.
RCross
9

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

( отсюда )

Vaiden
источник
1
Это еще один очень хороший ответ, поскольку он показывает, как вы можете проверять интервал по умолчанию, но принимать меры только на более щадящей основе.
RCross
2

Член моей команды придумал довольно умное решение, которое позволяет 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 "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"
Эдди
источник
2

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

 <START | STOP | RESTART> [PROGRAM] = "program"
    [[AS] UID <number | string>]
    [[AS] GID <number | string>]
    [[WITH] TIMEOUT <number> SECOND(S)]

В документах заявляют:

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

Что и будет делать значение "timeout".

jeteon
источник
Увеличение времени ожидания работает, если фактический запуск занимает много времени, но в исходном вопросе это звучит так, как будто программа, возможно, запустилась быстро (т.е. вернулась), но не выписала PID немедленно. Есть ли способ указать monit не проверять службу в течение указанного времени после перезапуска?
PeterVermont
Значение timeoutдолжно применяться как к пуску, так и к перезапуску. Насколько я понимаю, он устанавливает задержку перед тем, как Monit проверит, что он: a) работает, b) создан ожидаемый файл PID и c) выполняется процесс с ожидаемым PID. У меня были некоторые проблемы, заставляющие его работать, где указанное приложение было просто сценарием, который разветвлял реальный процесс, а затем возвращался, не зная, что происходит с процессом. Заставить его работать в этом случае было больно.
Jeteon
а как насчет перезагрузки системы и запуска сервисов? Есть ли способ указать начальную задержку в секундах для каждой проверки? также пассивные проверки без заявлений на запуск / останов
Массимо
Я верю в этом случае вы можете искать START DELAY.
Jeteon