¿Por qué el advenedizo sigue reapareciendo mi proceso?

19

Escribí un script inicial para lanzar un demonio dentro de una sesión 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 emito un stop bukkitmensaje, se congela durante ~ 10 segundos (supongo que el temporizador de apagado) e imprime bukkit start/running, process 2391. Cuando configuré el inicio 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é el advenedizo sigue reapareciendo mi proceso cuando se supone que lo detiene?

pasivo
fuente

Respuestas:

23

La dificultad aquí es la combinación de 'respawn' con un script previo a la detención que le indica al proceso que se detenga. De 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 es un poco poco clara sobre si salir con un estado de salida cero debería causar una reaparición. Sin embargo, fundamentalmente ha encontrado un error inicial 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, debe poder usar la "salida normal" para indicarle al principiante 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 robusto matar el proceso con una señal (especificando "kill signal N" si es necesario) en lugar de con un proceso previo a la detención que emite comandos; pero, por supuesto, esto no siempre es posible si el servicio no admite un apagado limpio al recibir una señal.

slangasek
fuente
Gracias, esa solución funciona perfectamente para mi caso. Encontré un informe de error para esto, pero parece que este comportamiento está diseñado conscientemente.
passy
La respuesta de Scott James Remnant no es el correcto - es un error, no es una decisión de diseño, el caso de prueba que se refiere a la prueba se entiende algo más :)
slangasek
2

Se lanzó una solución en la versión 1.10 para esto, por lo que ahora no debería suceder.

cprcrack
fuente
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación.
amc
2
No estoy completamente seguro de eso. Mi respuesta es equivalente a decir: sucede porque estás usando una versión anterior de advenedizo que tenía un error, usa la versión 1.10 o posterior para solucionarlo. Algo que ninguna de las otras respuestas indica, y en realidad la respuesta más útil ahora que se ha publicado la solución y hay pocas razones para una solución alternativa.
cprcrack
Estoy de acuerdo en que es útil, pero creo que es más útil como un comentario a la respuesta aceptada
amc