使Perl IPC :: Run泵每一行,而不是偶尔的批次

时间:2018-03-09 13:16:52

标签: perl flush perl-ipc-run

我使用IPC :: Run从cron运行脚本中的外部可执行文件获取输出。我需要它能够根据动态输出进行过滤和制定决策。但问题是它不是动态地给我输出,而是在几个批次中 - 一次只有许多行,只有在可执行文件运行了一段时间之后。是否有可能以grep --line-buffered的grep命令以某种方式刷新输出?在所有Perl站点中,我都没有看到这个问题。这是我的脚本部分:

use IPC::Run qw( start pump finish );
...
my $externalExecRun = start \@executableAndParameters, \undef, \$executableStdout, \$executableStderr ;
while (42) {
    pump $externalExecRun;
    if ($executableStdout eq '' and $engineStderr eq '') {last;}
    WriteToLog("\$executableStdout: -->$executableStdout<--");              #This writes many lines at once
    WriteToLog("\$executableStderr: -->$executableStderr<--");
    $executableStdout = "";
    $executableStderr = "";
}
finish $externalExecRun;

1 个答案:

答案 0 :(得分:2)

您可以使用IPC::Runnew_chunker让它逐行输出:

use warnings;
use strict;
use IPC::Run qw/ start new_chunker /;
use Data::Dump;

my $run = start ['perl','-le','print "a" x $_ for 1..180'],
    '>', new_chunker, \my $out, '2>', new_chunker, \my $err;
while (1) {
    $run->pump;
    last unless defined $out || defined $err;
    dd $out, $err;
    ($out,$err) = ();
}
$run->finish;

外部程序仍然可能不会逐行输出,在这种情况下,至少在* NIX上,将第一个'>'更改为'>pty>'(如建议的那样)由@ikegami在评论中)希望有所帮助;或@daxim提供的其中一个链接。