0

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

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

谢谢。

4

4 回答 4

6
  1. 您是否知道tail -f默认情况下也使用 1 秒睡眠?这是真的!(至少对于 GNU 尾巴...)
  2. File::Tail实际上使用Time::HiRessleep函数,这意味着睡眠时间参数不是整数;您可以将其设置为系统可以处理的任何小数秒数。
于 2010-09-10T02:13:31.250 回答
3

文档中有很多好东西,包括对这个确切问题的答案。从perlfaq5How 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 模块。

于 2010-09-10T10:10:06.713 回答
2

CPAN有File::ChangeNotify

于 2010-09-10T00:40:31.220 回答
0

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

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

于 2010-09-10T08:47:19.380 回答