我有一个 VPS,上面有一些 Java 应用程序(使用“Play Framework 制作”)在端口 9000、9001、9002 和 9003 上运行。VPS 提供商(iPage)有时会意外重启服务器,导致所有四个进程都停止运行。
我运行的进程由
nohup ./start -Dhttp.port=9000
,nohup ./start -Dhttp.port=9001
,nohup ./start -Dhttp.port=9002
, 和nohup ./start -Dhttp.port=9003
所有四个start
启动器均由“Play”制作并位于不同的文件夹中(内部/opt
)。
每次 iPage 重新启动我的 VPS 时,所有四个文件夹都会将其“RUNNING_PID”文件与其以前的 PID 一起保存,因此我必须手动删除这些文件才能再次将它们放上去。
我正在检查这个答案一个相对类似的问题(如果进程终止,我该如何编写 bash 脚本来重新启动它?nohup
) (我猜没有指定端口和样式)没有成功。
这是我目前所做的:
制作了一个
tryReboot
文件(保存到/opt/myJavaApp9000/
),其内容如下:until start -Dhttp.port=9000; do echo "9000 process crashed with exit code $?. Respawning.." >&2 sleep 1 done
通过使用添加
@reboot /opt/myJavaApp9000/tryReboot
到文件中crontab
crontab -e
重启服务器(通过 iPage Reboot)后,这四个服务器都保留了RUNNING_PID
文件,但没有一个重新启动。问题可能出在哪里?
答案1
可能是什么问题?以下是一些可能性:
- 重新阅读您提到的答案。
until [start -Dhttp.port=9000]; do
不应该有[
和]
括号。 - 如果你有
.
(当前目录)在你的搜索路径中,你不需要像现在这样./
在运行程序时说明。如果你start
不有.
在您的搜索路径中,您做需要./start
在tryReboot
脚本中说。 - 您的
tryReboot
脚本可能crontab
由于多种原因而无法运行。例如,冒着侮辱您智商的风险,您不会说您已经完成了chmod +x tryReboot
。您是否已验证正在运行?也许可以通过让它将消息写入日志文件?提示:您可能希望通过在您的字符串tryReboot
中包含日期和时间来在这些消息中包含日期和时间。$(date)
echo
- 这些
RUNNING_PID
文件可能会持续存在,因为没有删除它们的机制。(如果您已经说过您希望如何删除它们,我错过了。)您可能应该RUNNING_PID
在脚本开始时删除该文件tryReboot
;事实上,可能在每次迭代中都删除它(因为,如果您到达该echo
语句,则意味着start
命令已终止)。
但很难说清楚是问题,因为你的问题有点不清楚。
- 是
start
你的程序的名称,你真的用这样的命令启动它吗?还是一个在异步子进程中分叉并运行你的程序的程序?如果是后者,整个方法都不合适。nohup ./start -Dhttp.port=port_number &
start
until command; do … done
- 您尝试过手动运行吗
tryReboot
?结果如何?
ETC。
答案2
考虑使用监控。它是专门为这项任务而设计的。无需重新发明轮子。
只需编辑 /etc/monit/monitrc,添加脚本路径即可完成。