23 votos

Cómo hacer advenedizo de la espalda, en lugar de renunciar a

Quiero Advenedizo hacer dos cosas:

  1. dejar de tratar de respawn de un fallido proceso tan rápido
  2. nunca dé para arriba tratando de respawn

En un mundo ideal, upstart intenta reiniciar un muerto en el proceso después de 1s, a continuación, haga doble que el retraso en cada intento, hasta llegar a una hora.

Es algo parecido a esto posible?

29voto

Roger Dueck Puntos 194

El Arranque del libro de cocina recomienda un post-stop delay (http://upstart.ubuntu.com/cookbook/#delay-respawn-of-a-job). El uso de la respawn estrofa sin argumentos y seguirá tratando de siempre:

respawn
post-stop exec sleep 5

(Yo tengo este desde http://askubuntu.com/questions/52309/respawning-too-fast-stopped-how-to-make-upstart-disable-for-5-mins.)

Para agregar el retraso exponencial parte, me gustaría intentar trabajar con una variable de entorno en el post-parada de secuencia de comandos, creo, algo así como:

env SLEEP_TIME=1
post-stop script
    sleep $SLEEP_TIME
    NEW_SLEEP_TIME=`expr 2 * $SLEEP_TIME`
    if [ $NEW_SLEEP_TIME -ge 60 ]; then
        NEW_SLEEP_TIME=60
    fi
    initctl set-env SLEEP_TIME=$NEW_SLEEP_TIME
end script

** EDIT **

Para aplicar el retardo sólo cuando respawning, evitando la demora en la real parar, use el siguiente, que comprueba si el objetivo actual es "stop" o no:

env SLEEP_TIME=1
post-stop script
    goal=`initctl status $UPSTART_JOB | awk '{print $2}' | cut -d '/' -f 1`
    if [ $goal != "stop" ]; then
        sleep $SLEEP_TIME
        NEW_SLEEP_TIME=`expr 2 * $SLEEP_TIME`
        if [ $NEW_SLEEP_TIME -ge 60 ]; then
            NEW_SLEEP_TIME=60
        fi
        initctl set-env SLEEP_TIME=$NEW_SLEEP_TIME
    fi
end script

5voto

pingles Puntos 11

Como ya se ha mencionado, el uso de respawn para desencadenar el respawn.

Sin embargo, el Advenedizo libro de cocina de la cobertura en respawn-limit dice que necesitará especificar respawn limit unlimited a tener continua de reintento de comportamiento.

Por defecto se reintentar mientras el proceso no reaparecen más de 5 veces en 10 segundos.

Por lo tanto, le sugerimos:

respawn
respawn limit unlimited
post-stop <script to back-off or constant delay>

4voto

Diomidis Spinellis Puntos 8417

Terminé poniendo un start en un cronjob. Si el servicio se está ejecutando, no tiene ningún efecto. Si no se está ejecutando, se inicia el servicio.

1voto

the-wabbit Puntos 28168

Desea respawn limit <times> <period> - aunque esto no proporcionaría el comportamiento exponencial que está buscando, probablemente lo haría para la mayoría de los casos de uso. Usted podría tratar de usar valores muy grandes para times y period a la aproximación de lo que se intenta lograr. Ver el hombre 5 init's sección en respawn limit de referencia.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: