Dlaczego upstart odradza mój proces?

19

Napisałem skrypt wstępny do uruchomienia demona w sesji tmux. Działa dobrze i odradza proces, jeśli umiera nieoczekiwanie, ale nie mogę go zatrzymać ręcznie.

Zadanie (o nazwie bukkit) wygląda następująco:

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"

Kiedy wydaje mi się stop bukkit, zawiesza się na ~ 10 sekund (chyba czas uśpienia) i drukuje bukkit start/running, process 2391. Kiedy ustawiłem start do debugowania, znalazłem te odpowiednie wiersze w dzienniku:

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

Dlaczego upstart odradza mój proces, kiedy ma go zatrzymać?

passy
źródło

Odpowiedzi:

23

Trudność polega tu na połączeniu „odrodzenia” ze skryptem przed zatrzymaniem, który informuje proces o zatrzymaniu. Od 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.

Dokumentacja jest nieco niejasna, czy wyjście z zerowym statusem wyjścia powinno spowodować odrodzenie. Zasadniczo jednak znalazłeś błąd przyspieszający, ponieważ główny proces kończący się, gdy celem jest „stop”, nie powinien powodować zmiany na „respawn”.

Aby obejść ten błąd, powinieneś być w stanie użyć „normalnego wyjścia”, aby powiedzieć upstartowi, że jest to normalny sposób na zatrzymanie zadania i że nie powinien on się odrodzić.

  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

Zauważ, że ogólnie, bardziej niezawodne byłoby zabicie procesu za pomocą sygnału (określając „sygnał zabicia N”, jeśli to konieczne) zamiast za pomocą procesu przed zatrzymaniem, który wydaje polecenia; ale oczywiście nie zawsze jest to możliwe, jeśli usługa nie obsługuje czystego wyłączenia po otrzymaniu sygnału.

slangasek
źródło
Dziękuję, że obejście działa idealnie w moim przypadku. Znalazłem raport o błędzie , ale wygląda na to, że to zachowanie jest świadomie zaprojektowane.
passy
Odpowiedź Scotta Jamesa Remnanta jest prawidłowa - to błąd, a nie decyzja projektowa, przywołany przypadek testowy ma na celu przetestowanie czegoś innego :)
slangasek 28.09.11
2

W tej wersji wydano poprawkę 1.10, więc teraz nie powinno się to zdarzyć.

cprcrack
źródło
To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienia, zostaw komentarz pod postem.
amc
2
Nie jestem tego całkowicie pewien. Moja odpowiedź jest równoważna z powiedzeniem: Dzieje się tak, ponieważ używasz starej wersji programu upstart z błędem, użyj wersji 1.10 lub nowszej, aby to naprawić. Coś, czego nie podają żadne inne odpowiedzi, a właściwie najbardziej użyteczna odpowiedź teraz, gdy poprawka została wydana i nie ma powodu do obejścia tego problemu.
cprcrack
Zgadzam się, że jest przydatny, ale myślę, że jest bardziej przydatny jako komentarz do zaakceptowanej odpowiedzi
amc