1

我需要检查日志文件,直到 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 命令一样。

谢谢。

4

1 回答 1

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;
    }
}
于 2012-11-20T11:29:34.360 回答