¿Por qué upstart sigue reapareciendo mi proceso?

19

Escribí un script upstart para iniciar un daemon dentro de una sesión de tmux. Funciona bien y reaparece el proceso si muere inesperadamente, pero parece que no puedo detenerlo manualmente.

El trabajo (llamado bukkit) se ve así:

start on filesystem
stop on runlevel [!2345]

respawn
respawn limit 5 30

chdir /home/minecraft/bukkit

expect daemon
kill timeout 30

pre-start script
    test -x /home/minecraft/bukkit/craftbukkit-0.0.1-SNAPSHOT.jar || { stop; exit 0; }
end script

pre-stop script
    tmux send -t bukkit "stop"
    tmux send -t bukkit "Enter"
    sleep 10  # Wait for server to shut down properly
end script

exec tmux new-session -d -s minecraft -n bukkit "sudo -u minecraft -- /home/minecraft/java/jre1.6.0_27/bin/java -Xincgc -Xmx1G -jar /home/minecraft/bukkit/craftbukkit-0.0.1-SNAPSHOT.jar"

Cuando publico un stop bukkit , se congela durante ~ 10 segundos (el temporizador de reposo, supongo) e imprime bukkit start/running, process 2391 . Cuando configuré el arranque para depurar, encontré estas líneas relevantes en el registro:

Sep 21 19:14:59 cheftest init: bukkit goal changed from start to stop
Sep 21 19:14:59 cheftest init: bukkit main process (2499) exited normally
Sep 21 19:14:59 cheftest init: bukkit main process ended, respawning
Sep 21 19:14:59 cheftest init: bukkit goal changed from stop to respawn

¿Por qué upstart sigue reapareciendo mi proceso cuando se supone que debe detenerlo?

    
pregunta passy 21.09.2011 - 17:20

3 respuestas

23

La dificultad aquí es la combinación de 'respawn' con una secuencia de comandos previa a la detención que indica al proceso que se detenga. Desde init (5):

   respawn
         A service or task with this stanza will be automatically started
         if it should stop abnormally.  All reasons for a service stopping,
         except the stop(8) command itself, are considered abnormal.  Tasks
         may exit with a zero exit status to prevent being respawned.

La documentación no está del todo clara en cuanto a si salir con un estado de salida cero debería causar un respawn. Sin embargo, fundamentalmente has encontrado un error advenedizo porque el proceso principal que finaliza cuando el objetivo es 'detener' no debería dar como resultado un cambio a 'reaparecer'.

Para evitar este error, debería poder usar la "salida normal" para indicarle al advenedizo que esta es una forma normal de detener el trabajo y que no debería reaparecer.

  normal exit STATUS|SIGNAL...
         Additional exit statuses or even signals may be added, if the
         job process terminates with any of these it will not be considered
         to have failed and will not be respawned.

         normal exit 0 1 TERM HUP

Tenga en cuenta que, en general, sería más sólido matar el proceso con una señal (especificando "kill signal N" si es necesario) en lugar de con un proceso de pre-stop que emite comandos; pero, por supuesto, esto no siempre es posible si el servicio no admite el apagado limpio al recibir una señal.

    
respondido por el slangasek 21.09.2011 - 21:18
3

En caso de que alguien más termine aquí, he enviado un parche de trabajo al error:

enlace

    
respondido por el adamel 13.11.2012 - 19:35
2

Se lanzó una corrección en el advenedizo 1.10 para esto, por lo que ahora no debería suceder.

    
respondido por el cprcrack 18.05.2014 - 01:46

Lea otras preguntas en las etiquetas