Sha*_*ley 7 parallel-processing perl logging
我有一个程序,它应该运行一组其他程序并收集它们的输出用于记录目的.只要输出标准输出,一切都正常.
这让我想到了两个问题:
如何在一个文件中捕获两个STDIN
和STDERR
另一个程序?
如果根本没有输出(或STDERR
仅输出),程序将卡在线上:
while (<$input>)
Run Code Online (Sandbox Code Playgroud)我怎样才能让程序等待从不确定的运行时另一个程序输出可能的,并且仍然在继续,如果有由程序执行完毕的时间没有输出.
这是代码的那一部分
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\"";
}
Run Code Online (Sandbox Code Playgroud)
注意:$fh
是我的文件处理程序,用于写入我的日志文件,@errors
用于在程序中内部报告错误.
编辑:我想在经历了一个问题PROC ::可靠的途径是,它似乎对效果后有STDOUT
和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
Run Code Online (Sandbox Code Playgroud)
如果从类似 POSIX 的 shell 启动,则该2>&1
表示法会将标准错误发送到与标准输出相同的位置:
some-program-to-be-logged 2>&1 | perl logger.pl -o /chosen/log.file
Run Code Online (Sandbox Code Playgroud)
标准输出和标准错误都发送到 Perl 日志记录脚本的标准输入。
记录器脚本中的输入循环将挂起等待,直到有输入要读取,或者直到所有打开管道进行写入的进程关闭管道(通常是因为它们退出)。
归档时间: |
|
查看次数: |
736 次 |
最近记录: |