这是我的 upstart 文件/etc/init/myapp.conf
:
description "Example of starting Node with Upstart and Forever"
start on filesystem or runlevel [2345]
stop on runlevel [06]
expect fork
console output
setuid lwood
env HOME=/home/lwood
env LOG="/home/lwood/myapp/applog.log"
script
cd $HOME
exec forever -a -l $LOG \
start /home/lwood/myapp/app.js
end script
pre-stop script
cd $HOME
exec forever stop /home/lwood/myapp/app.js >> $LOG
end script
你知道为什么sudo restart myapp
只停止服务吗?停止后不会启动服务。所以它的效果和 一样sudo stop myapp
。
执行sudo stop myapp
然后就sudo start myapp
可以正常工作了。想知道为什么重新启动的行为会有所不同。
我在使用 Ubuntu 12.04。
答案1
有一个新贵中的错误。它仍然存在于 Ubuntu Raring 13.04 中,但我还没有测试过 Saucy 或更高版本。
基本上,pre-stop
应该避免。它会导致重启时状态发生未定义的改变。如果您使用它来触发守护进程的关闭(如您的情况一样),它将停止一切。在更传统的用法中,即使指定脚本pre-stop
也会阻止您的主进程重启(如错误报告中所示)。
“停止时”作业的行为似乎不受影响,因此一种解决方案是创建一个myapp-stop.conf
在“停止 myapp 时”触发的作业。唯一明显的缺点是更难知道所有其他潜在的“停止 myapp 时”作业何时完成。
答案2
为了扩展 xdissent 的答案(对我有用),这里有一个可以放入的示例脚本/etc/init/tomcat-stop.conf
。当tomcat
服务停止时,此脚本将运行并在 Upstart 重新启动 Tomcat 之前干净地关闭它。
description "Tomcat Server shutdown script"
setuid tomcat_user
setgid tomcat_group
chdir /usr/local/tomcat
start on stopping tomcat
kill timeout 30
script
exec bin/catalina.sh stop
end script