Haz que Monit espere más tiempo antes de pensar que algo está muerto

20

Estoy tratando de iniciar un programa (Resque), pero toma un poco de tiempo antes de que se escriba un archivo pid. Por lo tanto, creo que Monit cree que el programa no se ha iniciado e inicia uno o dos programas más antes de que se escriba el archivo de solicitud del primero.

¿Cómo puedo retrasar el tiempo que Monit verifica nuevamente, solo para este proceso? ¿O debería resolver esto de otra manera?

Ramon Tayag
fuente
Agregué una nueva respuesta a continuación. Aunque esperar más tiempo entre controles evitará colisiones por servicios lentos, puede ser una experiencia realmente mala para los clientes.
Eddie

Respuestas:

10

¿Cómo puedo retrasar el tiempo que Monit verifica nuevamente, solo para este proceso?


Lo que está tratando de lograr podría hacerse a través de la función " TIEMPO DE ENCUESTA DE SERVICIO " de monit

La documentación de Monit dice

Los servicios se verifican en intervalos regulares dados por el

set daemon n

declaración. Las verificaciones se realizan en el mismo orden en que están escritas en el archivo .monitrc, excepto si las dependencias se configuran entre los servicios, en cuyo caso la jerarquía de servicios puede alternar el orden de las verificaciones.

Uno de los métodos para personalizar la encuesta de servicio es

  1. intervalo personalizado basado en la duración del ciclo de sondeo múltiple

CADA [número] CICLOS

Ejemplo:

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

¿O debería resolver esto de otra manera?


También hice un intento inicial de monitorear trabajos de resque con monit porque monit es un demonio muy liviano pero finalmente se estableció con DIOS. Lo sé, sé que DIOS necesita más recursos en comparación con monit, pero en caso de resque, encontramos que es una buena combinación.

kaji
fuente
¡Gracias! Terminé usando cada x ciclos. Acabo de encontrar el número que funcionó para mí.
Ramon Tayag
19

Puede verificar un servicio específico en un intervalo diferente al predeterminado ...

Ver TIEMPO DE ENCUESTA DE SERVICIO en la documentación de Monit.

Un ejemplo para su programa Resque sería verificar un número diferente de ciclos:

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

o de la sección de ejemplos:

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

o puede aprovechar las comprobaciones de estilo cron.

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

o si experimenta un inicio lento, puede extender el tiempo de espera en el comando de inicio del servicio:

check process apache with pidfile /var/run/httpd.pid
       start program = "/etc/init.d/httpd start" with timeout 90 seconds
ewwhite
fuente
La misma respuesta, ¿verdad?
ewwhite
2
with timeout 90 secondsEra exactamente lo que quería. Gracias.
Andrew
1
Felicitaciones por incluir tiempos de espera y estilo cron. Esta es la respuesta más precisa y completa.
RCross
9

También puede verificar si algo ha fallado X veces seguidas:

 if failed 
    port 80 
    for 10 cycles 
 then alert

O para X veces dentro de las encuestas Y:

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

O ambos:

 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'

( desde aquí )

Vaiden
fuente
1
Esta es otra muy buena respuesta, ya que muestra cómo puede verificar el intervalo predeterminado, pero solo tomar medidas de manera más indulgente.
RCross
2

A un miembro de mi equipo se le ocurrió una solución bastante inteligente que permite que monit verifique con frecuencia (cada minuto) , pero una vez que haya intentado reiniciar el servicio (que demora ~ 10 minutos) esperará un período de gracia específico antes de intentar comenzar de nuevo.

Esto evita esperar demasiado entre verificaciones, lo que combinado con un inicio lento es un impacto mucho mayor para los clientes. Funciona mediante el uso de un script intermedio que actúa como indicador para indicar que monit ya está tomando medidas desde el último error.

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 (aplicación web de inicio lento) está inactivo durante 3 minutos seguidos, reinicie, PERO solo si aún no se está ejecutando un script de reinicio.

El script que se llama tiene una suspensión especificada que espera MÁS Y luego la hora de inicio más lenta para el servicio (en nuestro caso esperamos terminar en ~ 10, por lo que dormimos durante 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
fuente
2

La versión actual de Monit (5.16) admite un tiempo de espera para los scripts de inicio con la sintaxis:

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

Los documentos indican:

En el caso de una verificación de proceso, Monit esperará hasta 30 segundos para que finalice la acción de inicio / detención antes de darse por vencido e informar un error. Puede anular este tiempo de espera usando la opción TIEMPO DE ESPERA.

Que es lo que hará el valor de "tiempo de espera".

jeteon
fuente
Ampliar el tiempo de espera funciona si el inicio real lleva mucho tiempo, pero en la pregunta original parece que el programa puede haberse iniciado rápidamente (es decir, devuelto) pero no escribió el PID de inmediato. ¿Hay alguna manera de decirle a Monit que no verifique el servicio durante un tiempo específico después del reinicio?
PeterVermont
El timeoutdebería aplicarse tanto a los inicios como a los reinicios. Según tengo entendido, se demora antes de que Monit compruebe que: a) se está ejecutando, b) se crea el archivo PID esperado yc) se está ejecutando un proceso con el PID esperado. Tuve algunos problemas para que funcione cuando la aplicación especificada era solo un script que bifurcaba el proceso real y luego regresaba sin saber qué estaba sucediendo con el proceso. Conseguir que funcione en este caso fue un dolor.
jeteon
¿Qué pasa con el sistema se reinicia y se inician los servicios? ¿Hay alguna forma de especificar un retraso inicial, en segundos, para cada verificación? también los controles pasivos sin declaraciones de inicio / parada
Massimo
Creo que en ese caso podrías estar buscando START DELAY.
jeteon