Faites attendre monit plus longtemps avant de penser que quelque chose est mort

20

J'essaie de démarrer un programme (Resque) mais cela prend un peu de temps avant qu'un fichier pid ne soit écrit. Ainsi, je pense que Monit pense que le programme n'a pas démarré et démarre un ou deux programmes supplémentaires avant l'écriture du fichier pid du premier.

Comment puis-je retarder à nouveau l'heure de vérification de Monit, uniquement pour ce processus? Ou devrais-je résoudre cela d'une autre manière?

Ramon Tayag
la source
J'ai ajouté une nouvelle réponse ci-dessous. Bien que l'attente plus longue entre les vérifications prévienne les collisions pour les services lents, cela peut être une très mauvaise expérience pour les clients.
Eddie

Réponses:

10

Comment puis-je retarder à nouveau l'heure de vérification de Monit, uniquement pour ce processus?


Ce que vous essayez d'atteindre pourrait être fait via la fonction " SERVICE POLL TIME " de monit

La documentation de Monit indique

Les services sont contrôlés à intervalles réguliers par le

set daemon n

déclaration. Les vérifications sont effectuées dans le même ordre qu'elles sont écrites dans le fichier .monitrc, sauf si des dépendances sont configurées entre les services, auquel cas la hiérarchie des services peut alterner l'ordre des vérifications.

L'une des méthodes pour personnaliser l'interrogation du service est

  1. intervalle personnalisé basé sur la longueur du cycle d'interrogation multiple

CHAQUE [nombre] CYCLES

Exemple:

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

Ou devrais-je résoudre cela d'une autre manière?


J'ai également fait une première tentative pour surveiller les tâches de resque avec monit car monit est un démon très léger mais finalement réglé avec DIEU. Je sais, je sais que DIEU est plus gourmand en ressources par rapport au monit mais en cas de resque nous avons trouvé que c'était un bon match.

kaji
la source
Merci! J'ai fini par utiliser tous les x cycles. Je viens de trouver le numéro qui a fonctionné pour moi.
Ramon Tayag
19

Vous pouvez vérifier un service spécifique à un intervalle différent de celui par défaut ...

Voir SERVICE POLL TIME dans la documentation Monit.

Un exemple pour votre programme Resque serait de vérifier un nombre différent de cycles:

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

ou dans la section des exemples:

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

ou vous pouvez tirer parti des vérifications de style cron.

check process resque with pidfile /var/run/resque.pid
   every 10 * * * *

ou si vous rencontrez un démarrage lent, vous pouvez prolonger le délai d'expiration dans la commande de démarrage du service:

check process apache with pidfile /var/run/httpd.pid
       start program = "/etc/init.d/httpd start" with timeout 90 seconds
ewwhite
la source
Même réponse, non?
ewwhite
2
with timeout 90 secondsétait exactement ce que je voulais. Merci.
Andrew
1
Bravo pour inclure les délais d'attente et le style cron. Ceci est la réponse la plus précise et la plus complète.
RCross
9

Vous pouvez également vérifier si quelque chose a échoué pendant X fois de suite:

 if failed 
    port 80 
    for 10 cycles 
 then alert

Ou pendant X fois dans les sondages Y:

 if failed 
    port 80
    for 3 times within 5 cycles 
 then alert

Ou les deux:

 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'

( d'ici )

Vaiden
la source
1
C'est une autre très bonne réponse, car elle montre comment vous pouvez vérifier l'intervalle par défaut, mais n'agissez que sur une base plus indulgente.
RCross
2

Un membre de mon équipe a trouvé une solution plutôt intelligente qui permet à monit de vérifier fréquemment (toutes les minutes) , mais une fois qu'il a tenté de redémarrer le service (ce qui prend environ 10 minutes), il attendra une période de grâce spécifiée avant d'essayer de démarrer encore.

Cela évite d'attendre trop longtemps entre les contrôles, ce qui, combiné à un démarrage lent, a un impact beaucoup plus important pour les clients. Il fonctionne en utilisant un script intermédiaire qui agit comme indicateur pour indiquer que monit prend déjà des mesures depuis le dernier échec.

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'"

Si bamboo (application Web à démarrage lent) est arrêté pendant 3 minutes d'affilée, redémarrez, MAIS uniquement si un script de redémarrage n'est pas déjà en cours d'exécution.

Le script qui est appelé a un sommeil spécifié qui attend plus longtemps que l'heure de début la plus lente pour le service (dans notre cas, nous nous attendons à terminer en ~ 10, donc nous dormons pendant 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"
Eddie
la source
2

La version actuelle de Monit (5.16) prend en charge un délai d'expiration pour les scripts de démarrage avec la syntaxe:

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

Les documents indiquent:

Dans le cas d'une vérification de processus, Monit attend jusqu'à 30 secondes pour que l'action de démarrage / arrêt se termine avant d'abandonner et de signaler une erreur. Vous pouvez remplacer ce délai d'expiration à l'aide de l'option TIMEOUT.

C'est ce que fera la valeur "timeout".

jeteon
la source
L'extension du délai d'attente fonctionne si le démarrage réel prend beaucoup de temps, mais dans la question d'origine, il semble que le programme ait démarré rapidement (c'est-à-dire retourné) mais n'a pas écrit le PID immédiatement. Existe-t-il un moyen de dire à monit de ne pas vérifier le service pendant une durée spécifiée après le redémarrage?
PeterVermont
Le timeoutdevrait s'appliquer aux démarrages et aux redémarrages. Autant que je sache, il met un délai avant que Monit vérifie que son: a) en cours d'exécution, b) le fichier PID attendu est créé et c) un processus avec le PID attendu est en cours d'exécution. J'ai eu quelques problèmes pour le faire fonctionner où l'application spécifiée n'était qu'un script qui a bifurqué le processus réel, puis est revenu sans savoir ce qui se passait avec le processus. Le faire fonctionner dans ce cas était pénible.
jeteon
qu'en est-il du système est redémarré et démarrer les services? existe-t-il un moyen de spécifier un délai initial, en secondes, pour chaque contrôle? aussi les contrôles passifs sans instructions start / stop
Massimo
Je crois que dans ce cas, vous pourriez être à la recherche START DELAY.
jeteon