Чому новачок продовжує відновлювати процес?


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. Коли я налаштувався налагоджувати, я знайшов у журналі ці відповідні рядки:

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

Складність тут полягає в поєднанні "respawn" зі скриптом перед зупинкою, який повідомляє процес припинити. З 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.

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

Щоб подолати цю помилку, ви повинні мати можливість скористатися "нормальним виходом", щоб сказати, що це нормальний спосіб зупинити роботу, і вона не повинна відновлюватися.

  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

3

У випадку, якщо хтось інший опиниться тут, я подав робочий виправлення в помилку:

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


Ласкаво просимо до Ask Ubuntu! Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Персик

2

Для цього було випущено виправлення з версією 1.10, тому зараз цього не повинно статися.


Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх дописом.
amc

2
Я не повністю впевнений у цьому. Моя відповідь еквівалентна тому, що сказати: Це трапляється тому, що ви використовуєте стару версію upstart, яка мала помилку, використовуйте версію 1.10 або новішу, щоб виправити її. Щось, на що ніхто з інших відповідей не говорить, і насправді найкорисніша відповідь зараз, коли виправлено виправлення, і причин для вирішення мало.
cprcrack

Я погоджуюся, що це корисно, але я вважаю, що це корисніше як коментар до прийнятої відповіді
amc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.