Perché upstart continua a rigenerare il mio processo?


19

Ho scritto uno script upstart per avviare un demone all'interno di una sessione di tmux. Funziona bene e rigenera il processo se muore inaspettatamente, ma non riesco a fermarlo manualmente.

Il lavoro (chiamato bukkit) è simile al seguente:

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"

Quando emetto un stop bukkitblocco si blocca per ~ 10 secondi (il timer di spegnimento, immagino) e stampa bukkit start/running, process 2391. Quando ho impostato l'avvio per il debug, ho trovato queste righe pertinenti nel 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

Perché upstart continua a rigenerare il mio processo quando dovrebbe fermarlo?

Risposte:


23

La difficoltà qui è la combinazione di "respawn" con uno script pre-stop che dice al processo di fermarsi. Da 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 documentazione non è abbastanza chiara sul punto se uscire con uno stato di uscita pari a zero debba provocare una rigenerazione. Tuttavia, fondamentalmente hai trovato un bug di avvio perché il processo principale che termina quando l'obiettivo è "stop" non dovrebbe comportare una modifica a "respawn".

Per ovviare a questo errore, dovresti essere in grado di utilizzare "uscita normale" per dire a inizio che questo è un modo normale per interrompere il lavoro e che non dovrebbe rigenerarsi.

  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

Si noti che in generale, sarebbe più robusto terminare il processo con un segnale (specificando "kill signal N" se necessario) anziché con un processo pre-stop che emette comandi; ma ovviamente questo non è sempre possibile se il servizio non supporta l'arresto pulito alla ricezione di un segnale.


Grazie, quella soluzione funziona perfettamente per il mio caso. Ho trovato una segnalazione di bug per questo, ma sembra che questo comportamento sia effettivamente progettato in modo consapevole.
passy,

La risposta di Scott James Remnant è quella corretta: è un bug, non una decisione di progettazione, il caso di test cui si fa riferimento è pensato per testare qualcos'altro :)
slangasek,


2

Una correzione è stata rilasciata in upstart 1.10 per questo, quindi ora non dovrebbe accadere.


Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post.
am

2
Non ne sono completamente sicuro. La mia risposta equivale a dire: succede perché stai usando una vecchia versione di upstart che aveva un bug, usa la versione 1.10 o più recente per risolverlo. Qualcosa che nessuna delle altre risposte afferma, e in realtà la risposta più utile ora che la correzione è stata rilasciata e ci sono poche ragioni per una soluzione alternativa.
cprcrack,

Sono d'accordo che sia utile, ma penso che sia più utile come commento alla risposta accettata
amc
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.