Perché l'upstart continua a rigenerare il mio processo?

19

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

Il lavoro (chiamato bukkit) ha il seguente aspetto:

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 bukkit si blocca per ~ 10 secondi (lo sleep timer, immagino) e stampa bukkit start/running, process 2391 . Quando ho impostato startstart per eseguire il debug, ho trovato queste righe rilevanti 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?

    
posta passy 21.09.2011 - 19:20

3 risposte

23

La difficoltà qui è la combinazione di 'respawn' con uno script di pre-arresto 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 è un po 'oscura sul punto se l'uscita con uno stato di uscita zero dovrebbe causare un respawn. 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 "exit normale" per indicare a upstart che questo è un modo normale per interrompere il lavoro e che non dovrebbe essere respawn.

  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 uccidere il processo con un segnale (specificando "kill signal N" se necessario) anziché con un processo di pre-arresto che emette comandi; ma ovviamente questo non è sempre possibile se il servizio non supporta lo spegnimento pulito al ricevimento di un segnale.

    
risposta data slangasek 21.09.2011 - 23:18
3

Nel caso in cui qualcun altro finisca qui, ho inviato una patch funzionante al bug:

link

    
risposta data adamel 13.11.2012 - 20:35
2

Per questo è stata rilasciata una correzione in Upstart 1.10, quindi ora non dovrebbe accadere.

    
risposta data cprcrack 18.05.2014 - 03:46

Leggi altre domande sui tag