Java:在后台运行shell脚本

时间:2016-12-22 14:24:13

标签: java multithreading shell

我试图在后台运行一个shell脚本,当我的函数/进程结束时它不会终止。然而,似乎尽管nohup,当java线程结束时。脚本也是如此。

以下是示例代码。

///
/// Tries to run a script in the background
///
try {
    Runtime rt = Runtime.getRuntime();
    Process pr = rt.exec("nohup sh ./runner.sh > output.txt &", new String[] {}, wrkDir);
    // pr.waitFor(); // Intentionally not using
} catch(Exception e) {
    throw new RuntimeException(e);
}

1 个答案:

答案 0 :(得分:1)

nohup适用于shell的调用,而不适用于调用程序。

可能有很多方法可以解决这个问题,但需要考虑的是尝试修改Java代码以调用调用nohup runner.sh...代码的启动程序shell脚本(无需启动{{1 }})。

像这样(未经测试的)代码:

修订版Java:

sh

<强> launcher.sh

///
/// Tries to run a script in the background
///
try {
    Runtime rt = Runtime.getRuntime();
    Process pr = rt.exec("sh ./launcher.sh", new String[] {}, wrkDir);
    // pr.waitFor(); // Intentionally not using
} catch(Exception e) {
    throw new RuntimeException(e);
}

我不确定这里的重定向,但是如果这样做(正如我所提到的,这个解决方案未经测试),那么缺点是你会因尝试调用#!/bin/sh nohup ./runner.sh > output.txt & 而失去反馈 - 任何错误该脚本调用对您的Java进程不可用。