【发布时间】:2010-07-29 09:17:46
【问题描述】:
我有以下 sn-p 调用一个写入 STDERR 和 STDOUT 的 perl 脚本。 我一直在遵循推荐的程序,例如在 perl 脚本中自动刷新 STDOUT 和 STDERR 以及使用 streamgobbler 线程。我注意到这在一定程度上有助于解决我的问题,但有时 perl 脚本会生成大量输出,但它仍会填满管道并挂起。唯一似乎阻止了将以下内容添加到我的 perl 脚本的事情,但显然我想要输出,所以这不是一个选项。
更新>>
另一个有趣的事件是当我在 linux 中 cat /proc/pid/fd/pipe# 时,它会导致管道被读取以被访问。这似乎转储了管道的内容,这意味着我的 perl 进程可以再次写入它并因此完成。因此必须是我的 java 进程没有正确读取进程输出流。
PERL:
close STDOUT
close STDERR
我的 java 如下所示
parserProcess = run.exec(config.getCMDArray(),env);
StreamGobbler errorGobbler = new StreamGobbler(parserProcess.getErrorStream(), "ERROR");
// any output?
StreamGobbler outputGobbler = new StreamGobbler(parserProcess.getInputStream(), "OUTPUT");
// kick them off
errorGobbler.start();
outputGobbler.start();
StreamGobbler 在哪里 ->
class StreamGobbler extends Thread
{
InputStream is;
String type;
StreamGobbler(InputStream is, String type)
{
this.is = is;
this.type = type;
}
public void run()
{
try
{
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
while ( (line = br.readLine()) != null)
System.out.println(type + ">" + line);
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
String line="";
status = parserProcess.waitFor();
提前致谢
【问题讨论】:
-
如果你的 Perl 脚本所做的只是关闭 STDOUT 和 STDERR,难怪你会明白 ;) 你能发布你的 Perl 脚本也做什么吗?