我需要检查日志文件,直到PID在perl中存活。 它在bash中运行良好。
tail -f --pid=1234 logfile.log
现在我需要和perl一样通过检查PID来检查日志文件,或者给我时间间隔也适用。
我使用以下代码在perl中执行此操作,但我能够拖尾文件并且有两个问题。
1)文件的尾部不会立即发生。
2)我想在几秒钟之后关闭尾巴,比如说100。
use warnings;
use strict;
use File::Tail;
my $name='/tmp/out';
my $file=File::Tail->new(name=>$name,interval=>1,maxinterval=>5,adjustafter=>1);
my ($found,$timeleft,@pending) = File::Tail::select(undef,undef,undef,100,$file);
if ($found)
{
print $pending[0]->read;
}
我正在使用上面的代码,它只在2秒内退出。我正在寻找一个像linux中的tailf命令一样的文件,以便在给定的时间后退出。
感谢。
答案 0 :(得分:1)
该模块非常努力,不会对拥有的文件进行“忙等待” 交通不多。只要它从文件中读取新数据,它就会重要 新行的数量,并按时间划分该行数 自从数据最后写入文件之前已经过去了。那是 考虑新数据写入之前的平均时间。什么时候 没有新的数据要读取,File :: Tail睡眠的数量 秒。此后,动态重新计算等待时间。注意 File :: Tail永远不会超过设置的秒数 通过maxinterval。
因此,如果您希望立即查看更新,则需要将maxinterval
设置为较低的数字。
更新:要超时,请使用select
。这个简单的例子对文件进行了100秒的单一检查。它还至少每五秒检查一次文件。有关使用循环的更复杂示例,请参阅上述文档。
use warnings;
use strict;
use File::Tail;
my $name='/tmp/out';
my $file=File::Tail->new(name=>$name,interval=>1,maxinterval=>5,adjustafter=>1);
my ($found,$timeleft,@pending) = File::Tail::select(undef,undef,undef,100,$file);
if ($found)
{
print $pending[0]->read;
}
更新:这是一个循环解决方案,将持续整个时间间隔:
use warnings;
use strict;
use File::Tail;
my $name='/tmp/out';
my $file=File::Tail->new(name=>$name,interval=>1,maxinterval=>5,adjustafter=>1);
my $time = 60;
while ($time > 0)
{
my ($found,@pending);
($found,$time,@pending) = File::Tail::select(undef,undef,undef,$time,$file);
if ($found)
{
print $_->read for @pending;
}
}