【问题标题】:Is there an equivalent of `tail -f` in Perl?Perl 中是否有相当于 `tail -f` 的功能?
【发布时间】:2010-09-10 00:36:45
【问题描述】:

我正在编写一个脚本来监听日志文件的变化并采取适当的行动。目前我正在使用open my $fh, "tail -f $logfile |";,但理想情况下我不想使用系统调用。

我尝试过File::Tail,但它的最小间隔为 1 秒(我尝试过更少但默认为 1 秒,即使我通过了 0)。我已经检查了它的来源,它似乎正在使用 sleep() ,它需要一个整数。在我尝试自己编写之前,还有其他选择吗?

谢谢。

【问题讨论】:

  • 它使用Time::HiRes::sleep,所以它需要小数。
  • 每当我往下走时似乎默认为 1,尽管我不得不承认我没有计时。

标签: linux perl tail


【解决方案1】:
  1. 您知道tail -f 默认情况下也使用 1 秒睡眠吗?这是真的! (至少对于 GNU tail...)
  2. File::Tail实际上使用了Time::HiRessleep函数,也就是说睡眠时间参数不是一个整数;您可以将其设置为您的系统可以处理的任何小数秒数。

【讨论】:

    【解决方案2】:

    文档中有很多好东西,包括对这个确切问题的答案。来自perlfaq5的回复How do I do a "tail -f" in perl?


    第一次尝试

    seek(GWFILE, 0, 1);
    

    语句 seek(GWFILE, 0, 1) 不会改变当前位置,但它会清除句柄上的文件结束条件,因此 next 会使 Perl 再次尝试读取某些内容。

    如果这不起作用(它依赖于您的 stdio 实现的功能),那么您需要更像这样的东西:

    for (;;) {
      for ($curpos = tell(GWFILE); <GWFILE>; $curpos = tell(GWFILE)) {
        # search for some stuff and put it into files
      }
      # sleep for a while
      seek(GWFILE, $curpos, 0);  # seek to where we had been
    }
    

    如果这仍然不起作用,请查看 IO::Handle 中的 clearerr 方法,该方法会重置句柄上的错误和文件结束状态。

    还有一个来自 CPAN 的 File::Tail 模块。

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        在我看来,使用tail -f 管道没有任何问题,就像你已经这样做了。在许多情况下,像“无系统调用”这样追求语言纯度会适得其反。

        另外,我发现File::Tail 在长时间运行的进程中存在问题。不幸的是,我无法用任何确凿的证据证实这一说法,因为它发生在很久以前,我没有调试问题,而是用 tail -F 管道代替了 File::Tail 的使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-02
          • 2012-06-18
          • 2023-03-31
          • 1970-01-01
          • 2020-11-23
          • 2019-10-31
          • 1970-01-01
          相关资源
          最近更新 更多