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/44946596/

相关文章:

java - 将数据传递到添加的 fragment - IlligalStateException : Fragment already active

java - 如何自动搭建开发环境?

java - 如何下载较旧的 google play 服务?

java - 使用JAVA更改LINUX机器的IP地址

php - MacPorts Apache : PDO works but mysql_connect and mysqi_connect does not

java - 检索firebase实时数据库中节点下的所有数据

linux - Linux 中文件描述符的理论限制

c++ - 无法在 OS X 10.9 Mavericks 上编译 Asterisk

bash - Youtube-dl下载脚本调试

java - 为什么我可以使用 Scala REPL 中的 Java 库而不是脚本中的?