Java 使用ApacheCommonsExec时出现问题

Java 使用ApacheCommonsExec时出现问题,java,apache-commons-exec,Java,Apache Commons Exec,我正在尝试使用Apache commons运行脚本,从终端运行的脚本看起来输出的数据类似于以下内容-- 编辑--根据建议进行编辑以介绍waitFor。 上述代码段返回的输出如下-- 使用ProcessBuilder的结果如下-- 进程以rc=139结束 标准输出: 标准错误: ./old-regresse.sh:第2行:3975分段错误。/ictest


我正在尝试使用Apache commons运行脚本,从终端运行的脚本看起来输出的数据类似于以下内容--
编辑--根据建议进行编辑以介绍waitFor。

上述代码段返回的输出如下--

使用ProcessBuilder的结果如下--

进程以rc=139结束
标准输出:
标准错误:
./old-regresse.sh:第2行:3975分段错误。/ictest
我想139是因为分割错误,可能是导致它失败的原因。有什么建议吗?

有人指出我做错了什么吗?如何同时捕获输出?

您正在执行的操作

exec.execute(commandline);
// gives the program no time to start or run.
return(outputStream.toString());
你应该做一些类似的事情

exec.execute(commandline).waitFor();    
// get the output only after the program has finished.
return(outputStream.toString());

我建议使用
org.apache.commons.exec.LogOutputStream
而不是ByteArrayOutputStream。单参数PumpStreamHandler构造函数捕获stdout和stderr——因此您在这方面做得很好。创建LogOutputStream的实例,并将其作为单个参数传递给PumpStreamHandler(就像您是BAS一样)

因为您只是在处理程序上调用waitFor(),所以只需在DefaultExecutor上使用同步执行方法:
int exitValue=exec.execute(commandline)


我会尝试将exit code设置为null,然后自己从execute的响应中检查exitValue。我想问题是,您的ByteArrayOutputStream从异常中被截断,超过标准输出,没有完全刷新内容。

我引入了waitFor,但它没有帮助。我在上面编辑了我的代码,以反映新的更改。看来您只得到了错误流。是否有其他方法获取输出流?我查找了javadoc for commons exec,但找不到任何方法。您可以改用ProcessBuilder吗?这是一个内置的类来做这种事情。ProcessBuilder也不走运。为上面的ProcessBuilder尝试添加了代码段。
./old-regress.sh: line 2: 15981 Segmentation fault      ./ictest < /tmp/tmp_inp_file
public class PBTest
{
    public static void main(String[] args) throws Exception
    {
        ProcessBuilder pb = new ProcessBuilder("./old-regress.sh");
        pb.directory(new File("/home/xxx/"));
        Process p = pb.start();
        String output = loadStream(p.getInputStream());
        String error  = loadStream(p.getErrorStream());
        int rc = p.waitFor();
        System.out.println("Process ended with rc=" + rc);
        System.out.println("\nStandard Output:\n");
        System.out.println(output);
        System.out.println("\nStandard Error:\n");
        System.out.println(error);
    }
    private static String loadStream(InputStream s) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(s));
        StringBuilder sb = new StringBuilder();
        String line;
        while((line=br.readLine()) != null)
            sb.append(line).append("\n");
        return sb.toString();
    }
}
Process ended with rc=139
Standard Output:


Standard Error:

./old-regress.sh: line 2:  3975 Segmentation fault      ./ictest < /tmp/tmp_inp_file
exec.execute(commandline);
// gives the program no time to start or run.
return(outputStream.toString());
exec.execute(commandline).waitFor();    
// get the output only after the program has finished.
return(outputStream.toString());