从Perl中的输出记录

Sha*_*ley 7 parallel-processing perl logging

我有一个程序,它应该运行一组其他程序并收集它们的输出用于记录目的.只要输出标准输出,一切都正常.

这让我想到了两个问题:

  1. 如何在一个文件中捕获两个STDINSTDERR另一个程序?

  2. 如果根本没有输出(或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 ::可靠的途径是,它似乎对效果后有STDOUTSTDERR,和我需要解决这些在每次通话后运行.这导致我的代码中的另一个问题.我正在并行运行STDOUT并对STDERR所有线程进行任何更改(至少使用Windows).

IO :: CaptureOutput对我来说有同样的问题,但它会尝试在内部纠正STDOUTSTDERR混乱,并导致发生以下错误:

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)

Jon*_*ler 1

如果从类似 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 日志记录脚本的标准输入。

记录器脚本中的输入循环将挂起等待,直到有输入要读取,或者直到所有打开管道进行写入的进程关闭管道(通常是因为它们退出)。