使用PID在perl中尾部文件

时间:2012-11-20 10:03:45

标签: linux perl

我需要检查日志文件,直到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命令一样的文件,以便在给定的时间后退出。

感谢。

1 个答案:

答案 0 :(得分:1)

来自the documentation

  

该模块非常努力,不会对拥有的文件进行“忙等待”   交通不多。只要它从文件中读取新数据,它就会重要   新行的数量,并按时间划分该行数   自从数据最后写入文件之前已经过去了。那是   考虑新数据写入之前的平均时间。什么时候   没有新的数据要读取,File :: Tail睡眠的数量   秒。此后,动态重新计算等待时间。注意   File :: Tail永远不会超过设置的秒数   通过maxinterval。

因此,如果您希望立即查看更新,则需要将maxinterval设置为较低的数字。

更新:要超时,请使用select。这个简单的例子对文件进行了1​​00秒的单一检查。它还至少每五秒检查一次文件。有关使用循环的更复杂示例,请参阅上述文档。

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;
    }
}