为什么新贵不断刷新我的流程?


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"

当我发出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

为什么新贵应该停止它时才重新产生我的过程?

Answers:


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.

关于是否以零退出状态退出是否会引起重生的问题,文档尚不清楚。但是,从根本上来说,您已经发现了一个新贵的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”)终止进程,而不是使用发出命令的停止前进程,则更健壮。但是,如果服务不支持在收到信号后彻底关机,则当然并非总是可能的。


谢谢您,该解决方法非常适合我的情况。我为此找到了一个错误报告,但似乎这种行为实际上是有意识地设计的。
passy 2011年

Scott James Remnant的答案是正确的-这是一个错误,而不是设计决定,提到的测试用例旨在测试其他内容:)
slangasek 2011年


2

为此,在新贵1.10中发布了一个修复程序,因此现在不应该发生。


这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论。
amc 2014年

2
我不太确定。我的回答等同于说:之所以发生这种情况,是因为您使用的是错误的upstart旧版本,请使用1.10或更高版本进行修复。没有其他答案的状态,实际上是最有用的答案,因为已发布此修复程序,几乎没有解决方法的理由。
cprcrack

我同意它是有用的,但我认为它作为对已接受答案的注释更有用
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.