我有一个程序应该运行一组其他程序并收集它们的输出以进行日志记录。只要有输出到标准输出,一切正常。
这导致了我的两个问题:
如何在一个文件中同时捕获
STDIN
和捕获STDERR
另一个程序?如果根本没有输出(或
STDERR
只有输出),程序将卡在行上:while (<$input>)
如何让程序等待来自另一个运行时间不确定的程序的可能输出,并且在程序完成执行时如果没有输出仍然继续。
这是代码的那部分
my $pid = open (my $input, '-|', "$prog $args")
or push @errors, "A failute has occurred in $prog $args";
if(not @errors){
while (<$input>){ #POSSIBLE LOCATION FOR HANG UP IF NO PRINTING IS DONE
if($input =~ /^END\n$/){
last;
}
print $fh $_;
}
}
else{
print $fh "An error has occurred with executing \"$prog $args\"";
}
注意:$fh
是我的文件处理程序,用于写入我的日志文件,并@errors
用于在我的程序中内部报告错误。
编辑:我在尝试Proc::ReliableSTDOUT
路由时遇到的一个问题是它似乎对and有后遗症STDERR
,我需要在每次调用运行后修复这些问题。这导致了我的代码中的另一个问题。我正在并行运行,并且对所有线程进行任何更改STDOUT
并STDERR
影响所有线程(至少使用 Windows)。
IO::CaptureOutput对我来说也有同样的问题,但它试图在内部更正STDOUT
和STDERR
混乱并导致发生以下错误:
Couldn't remove temp file 'C:\Users\SBLAKE~1\AppData\Local\Temp\m8E3pUGfOS' - Permission denied at C:/Perl/site/lib/IO/CaptureOutput.pm line 82