Почему выскочка продолжает возрождать мой процесс?

19

Я написал сценарий выскочки для запуска демона внутри сеанса tmux. Он работает хорошо и возрождает процесс, если он неожиданно умирает, но я не могу остановить его вручную.

Задача (называемая bukkit) выглядит следующим образом:

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"

Когда я выдаю stop bukkit , он замораживается в течение ~ 10 секунд (как я полагаю, таймер сна) и печатает bukkit start/running, process 2391 . Когда я установил upstart для отладки, я нашел эти соответствующие строки в журнале:

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

Почему выскочка продолжает возрождать мой процесс, когда он должен остановить его?

    
задан passy 21.09.2011 в 17:20
источник

3 ответа

23

Трудность здесь заключается в сочетании «респауна» с предварительным сценарием, который говорит о прекращении процесса. Из 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.

Документация немного неясна в отношении того, должен ли выход с нулевым статусом выхода вызвать респаун. Однако в основном вы обнаружили ошибку выскочки, потому что основной процесс, заканчивающийся, когда цель «stop», не должна приводить к изменению «респауна».

Чтобы обойти эту ошибку, вы должны иметь возможность использовать «обычный выход», чтобы сказать выскочку, что это обычный способ остановить работу и что она не должна появляться.

  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

Обратите внимание, что в общем случае было бы более здорово убить процесс сигналом (при необходимости указывая «сигнал уничтожения N») вместо процесса предварительной остановки, который выдает команды; но, конечно, это не всегда возможно, если служба не поддерживает чистое выключение после получения сигнала.

    
ответ дан slangasek 21.09.2011 в 21:18
источник
3

В случае, если кто-то еще окажется здесь, я отправил рабочий патч к ошибке:

Ссылка

    
ответ дан adamel 13.11.2012 в 19:35
2

Исправление было выпущено в upstart 1.10 для этого, так что теперь этого не должно произойти.

    
ответ дан cprcrack 18.05.2014 в 01:46