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 应用程序设置 upstart 脚本 (playframework.conf)
- 播放应用程序在服务器重启时成功启动 运行 'sudo
status playframework' will return playframework start/running,
进程 28912 - 此时进程 28912 不存在
- vi {playapplicationfolder}/server.pid 显示 28927
- 'stop playframework'
然后由于未知的 pid 28912 'status playframework' 导致失败
游戏框架 stop/killed,流程 28912
在此之后重启播放框架的唯一方法是找到实际进程并终止它,然后使用通常的 '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 中解决了这个问题。
使用我们一直用于 Play 1.2.7 的启动-停止守护程序的 Upstart 脚本现在无法stop/restart自 Play 1.3 以来由于其 PID 不正确而无法播放。
框架版本:1.3.0 on Ubuntu 12.04.5 LTS
复制步骤:
- 为 Play 应用程序设置 upstart 脚本 (playframework.conf)
- 播放应用程序在服务器重启时成功启动 运行 'sudo status playframework' will return playframework start/running, 进程 28912 - 此时进程 28912 不存在
- vi {playapplicationfolder}/server.pid 显示 28927
- 'stop playframework' 然后由于未知的 pid 28912 'status playframework' 导致失败 游戏框架 stop/killed,流程 28912
在此之后重启播放框架的唯一方法是找到实际进程并终止它,然后使用通常的 '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 中解决了这个问题。