我编写了一个新贵的脚本来在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"
当我发出a时,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
为什么新贵在应该停止它的过程中会不断重生我的过程?
这里的困难是“重生”与预停止脚本的结合,该脚本告诉过程停止。从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.
关于是否以零退出状态退出会引起重生的问题,文档尚不清楚。但是,从根本上讲,您已经发现了一个新贵的bug,因为在目标为“停止”时结束的主要过程不应导致对“重生”的更改。
要解决此错误,您应该能够使用“正常退出”来告诉新贵,这是停止工作的正常方法,并且不应重生。
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”)终止进程,而不是使用发出命令的停止前进程,则更健壮。但是,当然,如果服务不支持在收到信号后彻底关机,则这并非总是可能的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句