我使用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中。
答案 0 :(得分:-1)
我解决了。显然,当脚本从Java进程启动时,脚本在不同的目录中执行,其中脚本具有写入权限。因此没有错误,并且getErrorStream确实捕获了所有错误输出,在这种情况下只是"错误"。