Змусити моніта чекати довше, перш ніж думати, що щось мертве


20

Я намагаюся запустити програму (Resque), але пройде трохи часу, перш ніж буде написано pidfile. Таким чином, я вважаю, що Моніт вважає, що програма не запускалася, і запускає ще одну або дві програми до того, як буде написано pidfile першого.

Як я затримую час, коли Monit перевіряється ще раз, саме для цього процесу? Або я повинен вирішити це іншим способом?


Я додав нову відповідь нижче. Хоча очікування довше між чеками запобігає зіткненням для повільних послуг, це може бути дуже поганим досвідом для клієнтів.
Едді

Відповіді:


10

Як я затримую час, коли Monit перевіряється ще раз, саме для цього процесу?


Те, що ви намагаєтеся досягти, можна зробити за допомогою функції " СЕРВІС ОПИТУВАННЯ " monit

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

Послуги перевіряються через регулярні проміжки часу, задані службою

set daemon n

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

Одним із методів настройки сервісного опитування є

  1. нестандартний інтервал на основі тривалості циклу опитування, кратний

КОЖНО [число] ЦИКЛ

Приклад:

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

Або я повинен вирішити це іншим способом?


Я також робив первісну спробу монітору робочих завдань, оскільки моніт - дуже легкий демон, але врешті-решт вирішився з БОГ. Я знаю, я знаю, що БОГ є більш голодним у порівнянні з монітом, але у випадку рекету ми виявили, що це хороший збіг.


Спасибі! Я в кінцевому рахунку використовував кожні х циклів. Я щойно знайшов номер, який працював на мене.
Рамон Таяг

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

або ви можете використовувати чеки в стилі крона.

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

2
with timeout 90 secondsбуло саме те, чого я хотів. Спасибі.
andrew

1
Kudos для включення тайм-аутів та стилю крон. Це найточніша і найповніша відповідь.
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'

( звідси )


1
Це ще одна дуже хороша відповідь, оскільки показує, як можна перевірити інтервал за замовчуванням, але вжити заходів лише на більш прощальній основі.
RCross

2

Член моєї команди придумав досить розумне рішення, яке дозволяє монітору часто перевіряти (щохвилини) , але після того, як він спробує перезапустити службу (що займає ~ 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".


Подовження тайм-ауту працює, якщо власне запуск займає тривалий час, але в оригінальному питанні це здається, що програма, можливо, почалася швидко (тобто повернулася), але не виписала PID негайно. Чи є спосіб сказати monit не перевіряти службу протягом визначеного часу після перезавантаження?
PeterVermont

Це timeoutстосується як запуску, так і перезапуску. Наскільки я розумію, він ставить затримку перед тим, як Monit перевірить, чи є його: а) запущений, б) створений очікуваний PID-файл і в) процес із очікуваним PID поточно працює. У мене виникли деякі проблеми з тим, щоб він працював, коли вказана програма була лише сценарієм, який розщедрив реальний процес, а потім повернувся, не знаючи, що відбувається з процесом. Змусити його працювати в цьому випадку було болем.
jeteon

як щодо перезавантаження системи та запуску послуг? чи можна вказати початкову затримку в секундах для кожної перевірки? також пасивні перевірки без заяв про старт / стоп
Массімо

Я вірю в той випадок, який ви можете шукати START DELAY.
jeteon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.