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

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

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

Пасси
источник

Ответы:

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.

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

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

  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

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

slangasek
источник
Спасибо, что обходной путь отлично подходит для моего случая. Я нашел сообщение об ошибке для этого, но кажется, что это поведение на самом деле сознательно разработано.
Пасси
Ответ Скотта Джеймса Ремнанта есть правильный - это ошибка, а не проектное решение, упомянутый контрольный пример предназначен для проверки чего-то другого :)
slangasek
3

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

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

Адамел
источник
Добро пожаловать в Спросите Ubuntu! Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить здесь основные части ответа и предоставить ссылку для справки.
Peachy
2

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

cprcrack
источник
Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под своим постом.
AMC
2
Я не совсем уверен в этом. Мой ответ эквивалентен высказыванию: это происходит потому, что вы используете старую версию upstart с ошибкой, используйте версию 1.10 или новее, чтобы исправить ее. То, что ни в одном из других ответов не указано, и на самом деле самый полезный ответ сейчас, когда исправление выпущено, и нет никаких причин для обхода.
cprcrack
Я согласен, что это полезно, но я думаю, что это более полезно в качестве комментария к принятому ответу
amc