这就是我现在正在做的事情,但它会锁定文件。
#!/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;
答案 0 :(得分:4)
根据documentation,它不应该锁定。但是你的操作系统是什么?我不知道你是否使用Windows,尽管shebang系列没有提示。因此,有关您环境的更多详细信息将会有所帮助。
答案 1 :(得分:4)
Windows(或NTFS ......或Perl如何在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可能会有所帮助。