如何从Java运行Shell脚本并使其在JVM关闭后继续运行?

我正在编写插件以便在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也只会在此过程完成后退出&

要以无头模式运行进程,您需要使用nohup命令。有关详细信息,请参见此处。

用法如下所示:

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运行Shell脚本并使其在JVM关闭后继续运行? 的全部内容, 来源链接: utcz.com/qa/398003.html

回到顶部