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