我有一个名为 update.sh 的 bash 文件,它本质上是
- 从github拉取最新代码
- 编译新代码
- 停止正在运行的 java 服务器
- 使用更新后的代码再次启动 java 服务器
我的java代码如下:
Runtime.getRuntime().exec("/root/update.sh");
问题是,当运行 update.sh 的第 3 步时,它会杀死 JVM,而 JVM 又会杀死正在运行 update.sh 的子进程,这意味着它永远不会进入第 4 步。
有没有一种方法可以让 java 生成一个即使在 JVM 关闭后仍然存在的子进程?
我正在使用 EC2 Ubuntu 服务器。
最佳答案
一种可能的方法是将运行 update.sh 的部分与 java 服务器相互分离,并制作一个单独的 unix 进程来更新服务器。您可以使更新过程甚至在可能的重启中存活下来,将其包装在 upstart 中脚本
更新:或 runit , 或 daemontools , 或 systemd等(感谢@charles-duffy)
关于JVM 关闭时 Java 子进程死亡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57633813/