Perl执行命令,捕获和显示输出

时间:2012-09-03 09:03:06

标签: perl background-process

我需要从我的Perl脚本执行命令,这需要一段时间(1-2小时)。我希望能够看到命令的输出,以便我的脚本可以检查一切正常,但由于需要这么长时间,我希望用户在运行时看到命令输出。< / p>

我尝试了什么:

  • backticks - 只能在命令完成时获得输出
  • system - 只能在命令完成时获得输出
  • open - 几乎完美 - 但命令输出是缓冲的,这意味着用户很长时间都看不到更新。互联网上充满了设置$| = 1的建议,但显然这只会影响输入缓冲并且不起作用
  • 管道到tee - 与open相似的结果 - 'tee'似乎只是稍后打印
  • 重定向输出并使用Proc::BackgroundFile::Tail - 几乎完美,但想不出优雅的方法来停止打印循环

很想有个建议!


编辑:我接受了巴马斯的回答。我相信它有效,因为Expect.pm使用伪终端。对于将来看待这个问题的其他人来说,这就是我实现它的方式:

my $process = Expect->spawn($command, @params) or die "Cannot spawn $command: $!\n";

while ($process->expect(undef))
{
  print $process->before();
}

1 个答案:

答案 0 :(得分:2)

使用Expect.pm应禁用命令中的输出缓冲。