【问题标题】:Java Process stops early even when output is redirected即使输出被重定向,Java 进程也会提前停止
【发布时间】:2013-07-16 13:46:48
【问题描述】:

我有一个调用 tcsh 脚本的 Java 应用程序,该脚本又调用同一目录中的 perl 脚本。如果我通过键入“runPerlScript.sh”从命令中运行此脚本,它会完全正常工作,并生成几个应有的输出文件。但是,如果我从 Java 调用脚本,请使用以下代码:

    String[] runCmd  = {"/bin/tcsh","-c","/filepath/runPerlScript.sh"};
    Process run = Runtime.getRuntime().exec(runCmd);

    BufferedReader reader = new BufferedReader(new InputStreamReader(run.getInputStream()));

    String line = "";
    line = reader.readLine();
    System.out.println("\nStarting while.");
    while((line)!=null){
        System.out.println("Output from script: "+line);
        line=reader.readLine();
    }
    reader.close();
    System.out.println("Finished running perl script.");

它将我的 shell 脚本中的 echo 语句打印到我的控制台(我正在使用 NetBeans),但只生成 4 个输出文件(通常它生成接近 50 个)。似乎该过程提前退出了,因为在生成这 4 个文件之后,我的 shell 脚本中的 echo 语句显示“已完成运行 runPerlScript.sh”打印到我的控制台。我尝试了几种不同的方法来运行这个脚本,包括 ProcessBuilder,但似乎没有一种方法可以生成输出文件。我上面的代码实际上是我能够生成任何输出的唯一方法,因为 ProcessBuilder 只是导致挂断。有谁知道我怎样才能让脚本持续运行?

【问题讨论】:

    标签: java process


    【解决方案1】:

    来自 Runtime.exec() javadoc:

    “在单独的进程中执行指定的字符串命令。”

    假设您想等待进程结束,您将需要等待进程在您的主 java 线程中终止。最好的方法是监视 ProcessBuilder.start() 返回的 Process 并使用 Process.waitFor() 等待。

    【讨论】:

    • 即使使用 Process.waitFor() 方法,生成的输出仍然没有变化。它仍然只有 4 个文件,Java 认为它已经运行完成。
    • 您是否尝试过直接运行脚本而不是调用 tcsh(假设您的 shebang 行声明 #!/bin/tcsh)。
    • 是的,仍然只生成4个文件:(
    • process.exitValue() 告诉你什么?
    • ^在我发布这个问题之前也试过了。它仍然只生成 4 个文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多