Ubuntu upstart从Play 1.3中获取不正确的PID

时间:2015-02-10 09:29:55

标签: linux ubuntu playframework upstart

使用我们用于Play 1.2.7的start-stop-daemon的Upstart脚本现在无法停止/重新启动播放,因为Play 1.3的PID不正确。

Ubuntu 12.04.5 LTS上的框架版本:1.3.0

复制步骤:

  • 为Play应用程序设置upstart脚本(playframework.conf)
  • 播放应用程序在服务器重启时成功启动运行' sudo 状态playframework'将返回playframework开始/运行, 过程28912-此时过程28912不存在
  • vi {playapplicationfolder} /server.pid显示28927
  • '停止游戏框架' 由于未知的pid 28912'状态播放框架'结果是 playframework stop / killed,process 28912

此后重新启动播放框架的唯一方法是找到实际进程并将其终止然后使用通常的“播放开始”开始播放。手动命令。或者重新启动服务器。

现在这已经打破了我们的部署脚本,就像我们用来安装新版本的应用程序一样,然后在重新连接到负载均衡器之前重新启动。

Upstart Script:

#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

1 个答案:

答案 0 :(得分:1)

这是因为getJavaVersion()会产生一个子进程,它会破坏PID计数,这会破坏Upstart,后者希望Play根据您使用的期望值,一次或两次完全没有分叉。

我已经在pull request中解决了这个问题。