我正在编写一个插件,以便在 Linux 上重新启动服务器应用程序(尽管我正在 OSX 上进行测试)。我这样做的方法是使用一个 shell 脚本来命令应用程序停止,然后监督进程的终止,并在时机成熟时安全地启动一个新进程。
当我从命令行手动执行脚本时,我的脚本可以正常工作。但是,当我从应用程序中执行它时,shell 进程与应用程序一起被终止。
我尝试了两种不同的方法来从 Java 运行该进程:
String scriptArgs[] = {"sh", "restart.sh", "&"};
try {
Runtime.getRuntime().exec(scriptArgs);
} catch (IOException e) {
e.printStackTrace();
}
和
ProcessBuilder processBuilder = new ProcessBuilder("sh", "restart.sh");
try {
processBuilder.directory(new File(System.getProperty("user.dir")));
processBuilder.redirectErrorStream(false);
processBuilder.start();
} catch (IOException e) {
e.printStackTrace();
}
这两种方法都给出了相同的结果:脚本被调用,它成功地关闭了应用程序,然后它在继续之前就死了。有什么方法可以从 Java 启动一个完全独立的进程吗?
最佳答案
当您从 java 运行进程时,您正在创建一个 shell 实例,然后运行该进程。 shell 只会在此进程完成后退出,即使它正在后台运行 &
要在 headless 模式下运行进程,您需要使用 nohup
命令。详情请see here .
用法可能是这样的:
ProcessBuilder processBuilder = new ProcessBuilder("nohup", "sh", "restart.sh");
try {
processBuilder.directory(new File(System.getProperty("user.dir")));
processBuilder.redirectErrorStream(false);
processBuilder.start();
} catch (IOException e) {
e.printStackTrace();
}
关于java - 如何从 Java 运行 shell 脚本并让它在 JVM 关闭后继续运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44946596/