我正在编写一个脚本来侦听日志文件的更改并采取适当的行动。目前我正在使用open my $fh, "tail -f $logfile |";
,但理想情况下我不想使用系统调用。
我试过File::Tail但它的最小间隔为 1 秒(我尝试过少但它默认为 1 秒,即使我通过 0)。我已经检查了它的来源,它似乎正在使用 sleep() ,它需要一个整数。在我尝试自己编写之前,还有其他选择吗?
谢谢。
我正在编写一个脚本来侦听日志文件的更改并采取适当的行动。目前我正在使用open my $fh, "tail -f $logfile |";
,但理想情况下我不想使用系统调用。
我试过File::Tail但它的最小间隔为 1 秒(我尝试过少但它默认为 1 秒,即使我通过 0)。我已经检查了它的来源,它似乎正在使用 sleep() ,它需要一个整数。在我尝试自己编写之前,还有其他选择吗?
谢谢。
tail -f
默认情况下也使用 1 秒睡眠?这是真的!(至少对于 GNU 尾巴...)File::Tail
实际上使用Time::HiRes的sleep
函数,这意味着睡眠时间参数不是整数;您可以将其设置为系统可以处理的任何小数秒数。文档中有很多好东西,包括对这个确切问题的答案。从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 模块。
CPAN有File::ChangeNotify
tail -f
在我看来,像你已经这样做的那样使用管道没有任何问题。在许多情况下,像“无系统调用”这样的语言纯度会适得其反。
另外,我File::Tail
在长时间运行的进程中看到了问题。不幸的是,我无法用任何确凿的证据证实这一说法,因为它发生在很久以前,我没有调试问题,而是File::Tail
用tail -F
管道代替了使用。