Pourquoi upstart continue de réapparaître mon processus?


19

J'ai écrit un script parvenu pour lancer un démon dans une session tmux. Il fonctionne bien et réapparaît le processus s'il meurt de façon 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 bukkitil se bloque pendant environ 10 secondes (la minuterie de mise en veille, je suppose) et s'imprime bukkit start/running, process 2391. Lorsque j'ai configuré upstart pour déboguer, 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 upstart continue de réapparaître mon processus alors qu'il est censé l'arrêter?

Réponses:


23

La difficulté ici est la combinaison de «respawn» avec un script de pré-arrêt qui indique au processus de s'arrêter. Depuis 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 n'est pas claire sur le point de savoir si la sortie avec un statut de sortie zéro devrait provoquer une réapparition. Cependant, fondamentalement, vous avez trouvé un bug parvenu parce que le processus principal se terminant lorsque l'objectif est «stop» ne devrait pas entraîner de changement en «respawn».

Pour contourner ce bogue, vous devez être en mesure d'utiliser "sortie normale" pour indiquer à upstart 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 pré-stop qui émet des commandes; mais bien sûr, cela n'est pas toujours possible si le service ne prend pas en charge l'arrêt propre à la réception d'un signal.


Merci, cette solution de contournement fonctionne parfaitement pour mon cas. J'ai trouvé un rapport de bogue pour cela, mais il semble que ce comportement soit réellement conçu consciemment.
passy

La réponse de Scott James Remnant est la bonne - c'est un bug, pas une décision de conception, le cas de test auquel il est fait référence est destiné à tester autre chose :)
slangasek


2

Un correctif a été publié dans upstart 1.10 pour cela, alors maintenant cela ne devrait pas se produire.


Cela ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son article.
amc

2
Je n'en suis pas tout à fait sûr. Ma réponse équivaut à dire: cela se produit parce que vous utilisez une ancienne version de upstart qui avait un bogue, utilisez la version 1.10 ou plus récente pour le corriger. Quelque chose qu'aucune des autres réponses n'indique, et en fait la réponse la plus utile maintenant que le correctif a été publié et qu'il n'y a pas de raison de contourner ce problème.
cprcrack

Je suis d'accord que c'est utile mais je pense que c'est plus utile comme commentaire à la réponse acceptée
amc
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.