Runtime.getRunTime()。exec的行为与C语言“system()”命令不同

时间:2011-10-05 17:24:30

标签: java runtime.exec

在“C”中,我可以在启动过程退出后在后台运行一个长时间的阻止过程(并且还有继续运行)。

void main(void)
{
      system("some_long_blocking_process &");
      exit();
}

// "some_long_blocking_process" is still running here (DESIRED BEHAVIOR)

Java的getRuntime()。exec()没有这种行为。相反,“some_long_blocking_process”在Java进程结束时立即结束。

任何人都知道如何在Java中重现这种行为?

  1. 我使用的是Java 1.4(无流程构建器)
  2. 我特意想开始长时间的阻止过程并立即退出(没有“waitFor()等等)
  3. 我已经尝试过的事情(流程运行正常,但我仍然会遇到相同的不良行为)
    • 添加“nohup”并在前台运行(“nohup some_long_process”)
    • 添加“nohup”并在后台运行(“nohup some_long_process&”)
    • 在前台运行(“some_long_process”)
    • 在后台运行(“some_long_process&”)
  4. 谢谢!

    感谢所有的建议......我决定使用jtahlborn的答案(这对我有用)

5 个答案:

答案 0 :(得分:4)

试试这个:

String[] cmd = {"/bin/sh", "-c", "yourcommand args"};
Process p = Runtime.getRuntime().exec(cmd);

将重定向流重定向到/ dev / null:

String[] cmd = {"/bin/sh", "-c", "yourcommand args > /dev/null 2>&1 &"};
Process p = Runtime.getRuntime().exec(cmd);

答案 1 :(得分:3)

我们用java实现这一目标的唯一方法是添加另一层脚本。你需要一个简单的包装器脚本来调用你真正想要运行的应用程序,例如:

runner.sh:

#!/bin/sh

nohup "$@" > /dev/null 2>&1 &

然后从你的java程序中调用“/ bin / sh runner.sh the real command”。

答案 2 :(得分:1)

编辑:

你试过这个吗?

Runtime.getRuntime().exec("/bin/sh -c /usr/X11/bin/xterm &")

这对我在MacOS上有用。

上一个答案(JDK 1.5,对于没有正确阅读问题而道歉):

要在不等待的情况下执行流程,您可以使用ProcessBuilder

ProcessBuilder pb = new ProcessBuilder("/usr/X11/bin/xterm");
pb.start();

答案 3 :(得分:0)

你的问题可能是因为尾随&amp ;.尝试删除它。

getRuntime().exec()fork()exec()更相似,而不是system()

system()将命令传递给shell,它是Bash,它知道尾随的&符号意味着在后台运行该进程。

getRuntime().exec()使用StringTokenizer解析命令来解析命令,并且不对尾随的&符号做任何事情。这只是作为some_long_blocking_process的第一个参数传递,可能会在未知错误时立即退出。

答案 4 :(得分:0)

您是否尝试过生成新的Thread来运行可执行文件?尝试:

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Runtime.getRuntime().exec(<your exec>);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).run();

这样,在exec完成运行(并且线程已经完成)之前,主进程不会关闭。

此外,不要手动调用应用程序中的exit(),除非您有一些压倒性的理由--JVM可以很好地检测应用程序何时自行完成。这样,您就不会强制在后台运行的关闭线程。