当前位置: 首页>>技术教程>>正文


server – 为什么暴发户不断重生我的进程?

, ,

问题描述

我编写了一个新贵脚本来在 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 。当我设置 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

为什么暴发户在应该停止它的时候继续重生我的进程?

最佳方法

这里的困难在于 ‘respawn’ 与一个告诉进程停止的预停止脚本的组合。从初始化(5):

\\n

   respawn\\n         A service or task with this stanza will be automatically started\\n         if it should stop abnormally.  All reasons for a service stopping,\\n         except the stop(8) command itself, are considered abnormal.  Tasks\\n         may exit with a zero exit status to prevent being respawned.\\n

\\n

关于以零退出状态退出是否会导致重生的问题,文档有点不清楚。但是,从根本上讲,您发现了一个新贵错误,因为当目标为 ‘stop’ 时结束的主进程不应导致对 ‘respawn’ 的更改。

要解决此错误,您应该能够使用 “normal exit” 告诉 upstart 这是停止作业的正常方法并且它不应该重生。

\\n

  normal exit STATUS|SIGNAL...\\n         Additional exit statuses or even signals may be added, if the\\n         job process terminates with any of these it will not be considered\\n         to have failed and will not be respawned.\\n\\n         normal exit 0 1 TERM HUP\\n

\\n

请注意,一般而言,使用信号终止进程(如果需要,指定“终止信号 N”)而不是使用发出命令的预停止进程会更稳健;但当然,如果服务不支持在收到信号后完全关闭,这并不总是可能的。

次佳方法

万一其他人在这里结束,我已经提交了一个针对该错误的工作补丁:

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13019.html,未经允许,请勿转载。