1

Perl で PID が有効になるまで、ログ ファイルをチェックする必要があります。bashでは問題なく動作しています。

tail -f --pid=1234 logfile.log

今度は、PID をチェックするか、時間間隔を指定してログ ファイルをチェックするために、perl でも同じことを行う必要があります。

次のコードを使用して perl で実行していますが、ファイルを追跡でき、2 つの問題があります。

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 秒のチェックを 1 回実行します。また、少なくとも 5 秒ごとにファイルをチェックします。ループを使用したより複雑な例については、前述のドキュメントを参照してください。

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 に答える