如何从Java运行shell脚本并让它在JVM关闭后继续运行?

时间:2014-06-11 03:30:27

标签: java linux macos shell process

我正在编写一个插件,以便在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启动完全独立进程?

1 个答案:

答案 0 :(得分:3)

当您从java运行进程时,您正在创建一个shell实例,然后运行该进程。只有在后台&

中运行此过程完成后,shell才会退出

要在无头模式下运行进程,您需要使用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();
}