如果服务器重启,CentOS 中的进程也会重启

如果服务器重启,CentOS 中的进程也会重启

我有一个 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到文件中crontabcrontab -e

重启服务器(通过 iPage Reboot)后,这四个服务器都保留了RUNNING_PID文件,但没有一个重新启动。问题可能出在哪里?

答案1

可能是什么问题?以下是一些可能性:

  • 重新阅读您提到的答案。  until [start -Dhttp.port=9000]; do不应该有[]括号。
  • 如果你有.(当前目录)在你的搜索路径中,你不需要像现在这样./在运行程序时说明。如果你start.在您的搜索路径中,您需要./starttryReboot脚本中说。
  • 您的tryReboot脚本可能crontab由于多种原因而无法运行。例如,冒着侮辱您智商的风险,您不会说您已经完成了chmod +x tryReboot。您是否已验证正在运行?也许可以通过让它将消息写入日志文件?提示:您可能希望通过在您的字符串tryReboot中包含日期和时间来在这些消息中包含日期和时间。$(date)echo
  • 这些RUNNING_PID文件可能会持续存在,因为没有删除它们的机制。(如果您已经说过您希望如何删除它们,我错过了。)您可能应该RUNNING_PID在脚本开始时删除该文件tryReboot;事实上,可能在每次迭代中都删除它(因为,如果您到达该echo语句,则意味着start命令已终止)。

但很难说清楚问题,因为你的问题有点不清楚。

  • start你的程序的名称,你真的用这样的命令启动它吗?还是一个在异步子进程中分叉并运行你的程序的程序?如果是后者,整个方法都不合适。nohup ./start -Dhttp.port=port_number &startuntil command; do … done
  • 您尝试过手动运行吗tryReboot?结果如何?

ETC。

答案2

考虑使用监控。它是专门为这项任务而设计的。无需重新发明轮子。

只需编辑 /etc/monit/monitrc,添加脚本路径即可完成。

相关内容