upstartがプロセスを再生成し続けるのはなぜですか?


19

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が停止するはずのプロセスを再生成し続けるのはなぜですか?

回答:


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.

ドキュメンテーションは、終了ステータスがゼロで終了するとリスポーンが発生するかどうかの点で少し不明瞭です。ただし、基本的には、目標が「停止」のときに終了するメインプロセスが「リスポーン」への変更にならないため、アップスタートバグが見つかりました。

このバグを回避するには、「通常の終了」を使用して、これがジョブを停止する通常の方法であり、再起動しないことを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


2

この問題に対する修正がupstart 1.10でリリースされたため、今は発生しません。


これは質問に対する答えを提供しません。著者に批判や説明を求めるには、投稿の下にコメントを残してください。
AMC

2
私は完全にそれを確信していません。私の答えは、バグがあった古いバージョンのupstartを使用しているためです。バージョン1.10以降を使用して修正してください。他のどの回答にも記載されていないこと、および修正がリリースされ、回避策を講じる理由がほとんどないため、実際に最も有用な回答。
cprcrack

私はそれが便利だ同意するが、私はそれを受け入れ答えにコメントとしてより有用だと思う
AMC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.