即使重定向输出,Java Process也会提前停止

时间:2013-07-16 13:46:49

标签: java process

我有一个调用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只是导致了挂起。有谁知道如何继续让脚本运行?

1 个答案:

答案 0 :(得分:1)

来自Runtime.exec()javadoc:

  

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

假设您要等待进程结束,您需要等待进程在主java线程中终止。执行此操作的最佳方法是监视ProcessBuilder.start()返回的进程并等待Process.waitFor()。