Как мне хвост файл журнала без блокировки в Perl - PullRequest
6 голосов
/ 06 апреля 2011

Вот как я это делаю прямо сейчас, но он блокирует файл.

#!/usr/bin/perl
use Env qw( $USERNAME );
use File::Tail;
use strict;
use warnings;

my $file = $ARGV[0];

print "$file\n";

my $fileTail = File::Tail->new( name=>$file, maxinterval=>5, tail=>-1);
my $line;

while ( defined( $line = $fileTail->read ) )
{
    print $line;
}

exit;

Ответы [ 2 ]

4 голосов
/ 07 апреля 2011

Windows (или NTFS ... или как Perl реализует open в Windows ... не совсем уверен) имеет обязательную блокировку, свернутую в open (). Если вы откроете файл для чтения, другие не смогут открыть его для записи. Если вы откроете файл для записи, другие не смогут открыть его для чтения или записи.

Вы держите файл открытым для чтения, поэтому никто не может писать в журнал. Я думаю, что это то, что происходит. File :: Tail, вероятно, не учитывает это. Он работает вообще, потому что File :: Tail, кажется, время от времени закрывает и снова открывает дескриптор файла, если он не видит никаких действий, он предполагает, что он был усечен или воссоздан заново. Это снимет блокировку и позволит другим файлам проскользнуть для записи.

Вы можете проверить это, открыв файл для чтения одним процессом Perl, а затем попытайтесь открыть его для добавления другим.

Я считаю, что один из способов справиться с этим - открыть файл журнала, используя специальные функции Windows, которые позволяют вам контролировать поведение блокировки. Win32 :: SharedFileOpen похоже, что дело.

fsopen(my $fh, $file, 'r', SH_DENYNO) or
    die "Can't read '$file' with no locks: $!\n";

Это откроет файл для чтения без блокировок. К сожалению, вы несете ответственность за выполнение остальной части работы. perlfaq может помочь.

4 голосов
/ 06 апреля 2011

Согласно документации , она не должна блокироваться.Какая у вас операционная система?Интересно, используете ли вы Windows, хотя линия Шебанга говорит об этом нет.Поэтому было бы полезно узнать больше подробностей о вашей среде.

...