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

标签 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 启动一个完全独立的进程吗?

最佳答案

当您从 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/24154189/

相关文章:

java - toast 图像标题 onclick

macos -/usr/bin/ssh-copy-id: line 1: ucgi::command not found

c - 如何正确使用 SO_RXQ_OVFL 检测 Linux 套接字上的 UDP 溢出?

python - 在 Linux (CentOS) 的 Python 中及时获取负载或获取更短时间段的 getloadavg()

linux - 不同行中出现数字/单词

objective-c - 快速替代 drawInRect

ios - 3 或更多声道声音的音频流解决方案?

java - 如何在禁用 cookie 和不允许重写 URL 的情况下识别网站访问者?

Java:停止运行时间过长的线程?

java - 我们如何在Android中复制文件并保留其只读属性?