【问题标题】:Perl - Logging to terminal from a long running system callPerl - 从长时间运行的系统调用记录到终端
【发布时间】:2015-01-17 03:07:21
【问题描述】:

我正在使用反引号从我的 perl 代码中调用一个外部程序

print `<some long running program>`

长时间运行的程序将详细的日志消息打印到标准输出。 我遇到的问题是,由于缓冲,长时间运行的程序的输出在完成执行后立即打印出来。 我尝试让 STDOUT 文件句柄“热”,但这没有帮助。

有没有办法让我的程序连续打印到屏幕上?

【问题讨论】:

  • perl 经典文章,Suffering from Buffering 可能适用。
  • 这很有用,但我认为这里的根更多的是反引号而不是冲洗。

标签: perl


【解决方案1】:

作为 exec 管道打开,而不是使用反引号。

open ( my $prog_stdout, "-|", "/your/program" ) or die $!;

这将是 forkexec,但您可以访问 $prog_stdout 来做事。

例如

while ( <$prog_stdout> ) { 
    print;
}

(如果您的外部程序退出,它将关闭,因此while 将终止)。

您可能还希望包含文件句柄的自动刷新。 http://perldoc.perl.org/IO/Handle.html

但这可能不是必需的,因为输出不会无限期地缓冲。

【讨论】:

    【解决方案2】:

    它可能不是在缓冲,而是在外部程序完成时返回的事实。 但是,您可以使用读取管道逐行读取外部输出,

    use autodie;
    
    open my $pipe, "-|", "<some long running program>";
    # $pipe->autoflush();
    
    while (<$pipe>) { .. }
    

    【讨论】:

      猜你喜欢
      • 2020-11-02
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      相关资源
      最近更新 更多