使用我们用于Play 1.2.7的start-stop-daemon的Upstart脚本现在无法停止/重新启动播放,因为Play 1.3的PID不正确。
Ubuntu 12.04.5 LTS上的框架版本:1.3.0
复制步骤:
此后重新启动播放框架的唯一方法是找到实际进程并将其终止然后使用通常的“播放开始”开始播放。手动命令。或者重新启动服务器。
现在这已经打破了我们的部署脚本,就像我们用来安装新版本的应用程序一样,然后在重新连接到负载均衡器之前重新启动。
#Upstart script for a play application that binds to an unprivileged user.
# put this into a file like /etc/init/playframework
# you can then start/stop it using either initctl or start/stop/restart
# e.g.
# start playframework
description "PlayApp"
author "-----"
version "1.0"
env PLAY_BINARY=/opt/play/play
env JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
env HOME=/opt/myapp/latest
env USER=ubuntu
env GROUP=admin
env PROFILE=prod
start on (filesystem and net-device-up IFACE=lo) or runlevel [2345]
stop on runlevel [!2345]
limit nofile 65536 65536
respawn
respawn limit 10 5
umask 022
expect fork
pre-start script
test -x $PLAY_BINARY || { stop; exit 0; }
test -c /dev/null || { stop; exit 0; }
chdir ${HOME}
rm ${HOME}/server.pid || true
/opt/configurer.sh
end script
pre-stop script
exec $PLAY_BINARY stop $HOME
end script
post-stop script
rm ${HOME}/server.pid || true
end script
script
exec start-stop-daemon --start --exec $PLAY_BINARY --chuid $USER:$GROUP --chdir $HOME -- start $HOME -javaagent:/opt/newrelic/newrelic.jar --%$PROFILE -Dprecompiled=true --http.port=8080 --https.port=4443
end script
我们已尝试按照http://man.he.net/man8/start-stop-daemon在start-stop-daemon中指定PID文件,但这似乎也没有任何效果。
我找到了类似问题https://askubuntu.com/questions/319199/upstart-tracking-wrong-pid-of-process-not-respawning的一些主题,但到目前为止还未能找到解决方法。我已经尝试将fork更改为守护进程,但同样的问题仍然存在。我也无法看到Play 1.2.7和1.3之间发生了什么变化。
另一篇SO帖子也提出了类似的问题但尚未得到答案:https://stackoverflow.com/questions/23117345/upstart-gets-wrong-pid-after-launching-celery-with-start-stop-daemon
答案 0 :(得分:1)
这是因为getJavaVersion()
会产生一个子进程,它会破坏PID计数,这会破坏Upstart,后者希望Play根据您使用的期望值,一次或两次完全没有分叉。
我已经在pull request中解决了这个问题。