Warum startet upstart meinen Prozess immer wieder neu?

19

Ich habe ein Upstart-Skript geschrieben, um einen Daemon in einer tmux-Sitzung zu starten. Es funktioniert gut und startet den Prozess neu, wenn es unerwartet stirbt, aber ich kann es anscheinend nicht manuell stoppen.

Der Job (Bukkit genannt) sieht folgendermaßen aus:

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"

Wenn ich ein ausstelle stop bukkit, friert es für ~ 10 Sekunden ein (der Sleep-Timer, denke ich) und druckt bukkit start/running, process 2391. Als ich upstart zum Debuggen einrichtete, fand ich diese relevanten Zeilen im Protokoll:

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

Warum startet upstart meinen Prozess immer wieder neu, wenn er ihn stoppen soll?

passiv
quelle

Antworten:

23

Die Schwierigkeit hierbei ist die Kombination von 'Respawn' mit einem Pre-Stop-Skript, das den Prozess anweist, anzuhalten. Von 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.

Die Dokumentation ist ein wenig unklar, ob das Beenden mit einem Exit-Status von Null zu einem Respawn führen sollte. Grundsätzlich haben Sie jedoch einen Startfehler gefunden, da der Hauptprozess, der endet, wenn das Ziel "Stop" ist, nicht zu einer Änderung in "Respawn" führen sollte.

Um diesen Fehler zu umgehen, sollten Sie in der Lage sein, "normal exit" zu verwenden, um Emporkömmlingen mitzuteilen, dass dies ein normaler Weg ist, um den Job zu stoppen, und dass er nicht erneut erscheinen sollte.

  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

Es ist zu beachten, dass es im Allgemeinen robuster ist, den Prozess mit einem Signal (ggf. unter Angabe von "Kill Signal N") zu beenden, anstatt mit einem Pre-Stop-Prozess, der Befehle ausgibt. Dies ist jedoch nicht immer möglich, wenn der Dienst kein sauberes Herunterfahren beim Empfang eines Signals unterstützt.

Slangasek
quelle
Vielen Dank, diese Umgehung funktioniert perfekt für meinen Fall. Ich habe einen Fehlerbericht dafür gefunden, aber es scheint, dass dieses Verhalten tatsächlich bewusst gestaltet ist.
Passy
Scott James Remnants Antwort dort ist die richtige - es ist ein Fehler, keine Designentscheidung, der Testfall, auf den verwiesen wird, soll etwas anderes testen :)
Slangasek
3

Für den Fall, dass jemand anderes hier auftaucht, habe ich einen funktionierenden Patch für den Fehler eingereicht:

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

adamel
quelle
Willkommen bei Ask Ubuntu! Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Peachy
2

In Upstart 1.10 wurde ein Fix für dieses Problem veröffentlicht. Jetzt sollte es also nicht mehr passieren.

cprcrack
quelle
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klarstellung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag.
AMC
2
Da bin ich mir nicht ganz sicher. Meine Antwort ist gleichbedeutend mit: Es kommt vor, dass Sie eine alte Version von upstart verwenden, die einen Fehler aufwies. Verwenden Sie Version 1.10 oder eine neuere Version, um diesen Fehler zu beheben. Etwas, das in keiner der anderen Antworten angegeben ist und das derzeit die nützlichste Antwort ist, nachdem das Update veröffentlicht wurde und es wenig Grund für eine Problemumgehung gibt.
cprcrack
Ich bin damit einverstanden, dass es nützlich ist, aber ich denke, dass es als Kommentar zur akzeptierten Antwort nützlicher ist
amc