6

これは私が今やっている方法ですが、ファイルをロックします。

#!/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;
4

2 に答える 2

4

ドキュメントによると、それはロックされるべきではありません。あなたのオペレーティングシステムは何ですか?シバンの行はそうではないと示唆していますが、あなたはWindowsを使用しているのだろうか。したがって、環境に関する詳細が役立つでしょう。

于 2011-04-06T15:12:06.840 に答える
4

Windows (または NTFS... または Perl が Windows で open を実装する方法... 正確にはわかりません) は、必須のロックを open() に組み込みます。ファイルを読み取り用に開くと、他のユーザーはそのファイルを書き込み用に開くことができなくなります。ファイルを書き込み用に開くと、他のユーザーはそのファイルを読み取りまたは書き込み用に開くことができなくなります。

読み取り用にファイルを開いたままにしているため、誰もログに書き込むことができません。それが起こっていると思います。File::Tail はおそらくこれを考慮していません。File::Tail は、アクティビティが見られない場合、時々ファイルハンドルを閉じて再度開くように見えるため、まったく機能しています。これによりロックが解除され、他のファイルが書き込めるようになります。

これをテストするには、ある Perl プロセスで読み取り用にファイルを開き、別の Perl プロセスで追加用に開きます。

これに対処する 1 つの方法は、ロック動作を制御できる Windows 固有の機能を使用してログ ファイルを開くことだと思います。 Win32::SharedFileOpenが問題のようです。

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

これにより、ロックなしで読み取り用にファイルが開きます。残念ながら、残りの作業はあなたの責任です。perlfaqが役立つかもしれません。

于 2011-04-07T06:19:40.827 に答える