web-dev-qa-db-fra.com

Pourquoi est-ce que les nouveaux arrivants continuent de renouveler mon processus?

J'ai écrit un script pour lancer un démon dans une session tmux. Cela fonctionne bien et réapparaît le processus s'il meurt de manière inattendue, mais je n'arrive pas à l'arrêter manuellement.

Le travail (appelé bukkit) ressemble à ceci:

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"

Lorsque j'émets un stop bukkit, il se fige pendant environ 10 secondes (la minuterie d'arrêt, je suppose) et imprime bukkit start/running, process 2391. Lorsque j'ai configuré upstart pour le débogage, j'ai trouvé ces lignes pertinentes dans le journal:

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

Pourquoi est-ce que le parvenu continue à respiguer mon processus quand il est censé l'arrêter?

19
passy

La difficulté ici est la combinaison de "respawn" avec un script pré-stop qui indique au processus de s’arrêter. 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 documentation est un peu incertaine sur le point de savoir si quitter avec un statut de sortie nul devrait provoquer une réapparition. Cependant, fondamentalement, vous avez trouvé un bogue récent car le processus principal qui se termine lorsque l'objectif est "stop" ne doit pas entraîner le changement de "respawn".

Pour contourner ce bogue, vous devriez pouvoir utiliser "exit normal" pour indiquer à l'utilisateur qu'il s'agit d'un moyen normal d'arrêter le travail et qu'il ne doit pas réapparaître.

  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

Notez qu'en général, il serait plus robuste de tuer le processus avec un signal (en spécifiant "kill signal N" si nécessaire) plutôt qu'avec un processus de pré-arrêt émettant des commandes; mais bien entendu, cela n’est pas toujours possible si le service ne prend pas en charge l’arrêt complet à la réception d’un signal.

23
slangasek

Au cas où quelqu'un d'autre finirait ici, j'ai soumis un correctif fonctionnel au bogue:

https://bugs.launchpad.net/upstart/+bug/568288/comments/6

3
adamel

Un correctif a été publié dans la dernière version 1.10 pour cela, donc cela ne devrait plus arriver.

2
cprcrack