繁体   English   中英

在Perl中是否有一个等效的“ tail -f”?

[英]Is there an equivalent of `tail -f` in Perl?

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

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

谢谢。

  1. 您是否知道tail -f默认还使用1秒睡眠? 这是真的! (至少对于GNU尾巴...)
  2. File::Tail实际上使用Time :: HiRessleep函数,这意味着sleep time参数不是整数; 您可以将其设置为系统可以处理的任意秒数。

文档中有很多不错的东西,包括对此确切问题的答案。 perlfaq5的答案到如何在perl中执行“ tail -f”?


第一次尝试

seek(GWFILE, 0, 1);

语句seek(GWFILE,0,1)不会更改当前位置,但是它确实清除了句柄上的文件结束条件,因此下一个条件使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模块。

CPAN具有File::ChangeNotify

我认为使用tail -f管道没有任何问题,就像您已经做过的那样。 在许多情况下,追求纯净语言(例如“无系统调用”)会适得其反。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM