Process.getErrorStream不捕获所有错误

时间:2016-10-03 15:18:24

标签: java

我使用ProcessBuilder创建一个在Linux上运行脚本的Process。我需要检查执行此脚本时是否有错误。

public static String contentInStream(InputStream stream) throws IOException
{
    return contentInReader(new InputStreamReader(stream));
}

public static String contentInReader(Reader reader) throws IOException
{
    BufferedReader br = new BufferedReader(reader);
    String line;
    String content = "";
    while ((line = br.readLine())!=null)
    {
        content += line+"\n";
    }
    return content;
}

public static void execScript(String script)
{
    ProcessBuilder pb = new ProcessBuilder("sh", script);
    Process process = pb.start();
    process.waitFor();
    String errors = contentInStream(process.getErrorStream());
    if (!errors.isEmpty())
    {
        throw new RuntimeException(errors);
    }
}

在测试脚本中,我产生两个错误,一个是通过显式写入错误通道,另一个是尝试写入脚本没有写权限的文件。

echo Warning
date > in
>&2 echo Error

问题是字符串错误只包含“错误”,而不是命令“date> in”中的错误。正如预期的那样,未创建文件“in”。如果我尝试“./testScript.sh> / tmp / std 2> / tmp / err”,则两个错误都在/ tmp / err中,如预期的那样。

字符串错误包含:Error

脚本自行运行时的输出:
/apps/testScript.sh: line 2: in: Permission denied Error

PS:我还测试了测试脚本中最后两行的顺序。我得到了相同的结果,因此错误可能不在contentInReader中。

1 个答案:

答案 0 :(得分:-1)

我解决了。显然,当脚本从Java进程启动时,脚本在不同的目录中执行,其中脚本具有写入权限。因此没有错误,并且getErrorStream确实捕获了所有错误输出,在这种情况下只是"错误"。