【问题标题】:How to run a shell script from Java and have it continue running after JVM shutdown?如何从 Java 运行 shell 脚本并在 JVM 关闭后继续运行?
【发布时间】:2014-07-31 23:52:52
【问题描述】:

我正在编写一个插件来重新启动 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 中启动一个完全独立的进程?

【问题讨论】:

  • 你试过 nohup 吗?
  • 谢谢,我从未听说过 nohup,但这正是我所需要的。将此作为答案发布,我会接受!

标签: java linux macos shell process


【解决方案1】:

当您从 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2011-08-25
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    相关资源
    最近更新 更多