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

Ubuntu upstart gets incorrect PID from Play 1.3

使用我们一直用于 Play 1.2.7 的启动-停止守护程序的 Upstart 脚本现在无法stop/restart自 Play 1.3 以来由于其 PID 不正确而无法播放。

框架版本:1.3.0 on Ubuntu 12.04.5 LTS

复制步骤:

在此之后重启播放框架的唯一方法是找到实际进程并终止它,然后使用通常的 'play start' 命令手动开始播放。或者重启服务器。

这已经破坏了我们的部署脚本,因为我们过去常常安装新版本的应用程序,然后在重新连接到负载平衡器之前重新启动游戏。

暴发户脚本:

#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

我们已经尝试在启动-停止守护进程中指定 PID 文件:http://man.he.net/man8/start-stop-daemon 但这似乎也没有任何效果。

我发现了一些关于类似问题的讨论帖https://askubuntu.com/questions/319199/upstart-tracking-wrong-pid-of-process-not-respawning,但到目前为止还没有找到解决方法。我曾尝试将 fork 更改为守护进程,但同样的问题仍然存在。我也看不出 Play 1.2.7 和 1.3 之间有什么变化导致了这个问题。

另一个 SO post 也提出了类似的问题,但还没有得到答案:

这是因为 getJavaVersion() 产生了一个子进程,它会增加 PID 计数,这会破坏 Upstart,后者期望 Play 恰好 none 分叉一次或两次,具体取决于哪个期望节你用。

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