我使用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;
答案 0 :(得分:2)
您可以使用IPC::Run
的new_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提供的其中一个链接。