Por que o upstart continua reaparecendo meu processo?

19

Eu escrevi um script para iniciar um daemon dentro de uma sessão do tmux. Ele funciona bem e reaparece o processo se ele morrer inesperadamente, mas não consigo pará-lo manualmente.

O trabalho (chamado bukkit) é assim:

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 eu emito um stop bukkit ele congela por ~ 10 segundos (o sleep timer, eu acho) e imprime bukkit start/running, process 2391 . Quando eu configuro o arranque para depurar, encontrei estas linhas relevantes no log:

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

Por que o upstart continua reaparecendo meu processo quando deveria interrompê-lo?

    
por passy 21.09.2011 / 19:20

3 respostas

23

A dificuldade aqui é a combinação de 'respawn' com um script pré-stop que diz ao processo para parar. Do 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.

A documentação é um pouco incerta sobre a questão de se sair com um status de saída zero deve causar um respawn. No entanto, fundamentalmente, você encontrou um erro inicial porque o processo principal que termina quando o objetivo é "parar" não deve resultar em uma mudança para "respawn".

Para contornar este bug, você deve ser capaz de usar a "saída normal" para dizer ao upstart que esta é uma maneira normal de parar o trabalho e que ele não deve reaparecer.

  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

Note que, em geral, seria mais robusto matar o processo com um sinal (especificando "kill signal N" se necessário) em vez de um processo de pré-parada que emite comandos; mas é claro que isso nem sempre é possível se o serviço não suportar o desligamento limpo após o recebimento de um sinal.

    
por slangasek 21.09.2011 / 23:18
3

Caso alguém mais acabe aqui, enviei um patch de trabalho para o bug:

link

    
por adamel 13.11.2012 / 20:35
2

Uma correção foi lançada no iniciante 1.10 para isso, então agora isso não deveria acontecer.

    
por cprcrack 18.05.2014 / 03:46