Tmuxセッション内でデーモンを起動するためのupstartスクリプトを作成しました。うまく機能し、予期せず終了した場合はプロセスを再生成しますが、手動で停止することはできません。
ジョブ(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
Upstartが停止するはずのプロセスを再生成し続けるのはなぜですか?
ここでの困難は、「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.
ドキュメンテーションは、終了ステータスがゼロで終了するとリスポーンが発生するかどうかの点で少し不明確です。ただし、基本的には、目標が「停止」になったときに終了するメインプロセスが「リスポーン」への変更にならないため、アップスタートバグが見つかりました。
このバグを回避するには、「正常終了」を使用して、これがジョブを停止する通常の方法であり、再起動しないことを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"を指定)でプロセスを強制終了する方が堅牢であることに注意してください。しかし、もちろん、サービスがシグナルの受信時のクリーンシャットダウンをサポートしていない場合、これは常に可能とは限りません。
誰か他の人がここにたどり着く場合に備えて、バグに対する作業パッチを提出しました。
この問題に対する修正がupstart 1.10でリリースされたため、今は発生しません。