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(或 NTFS……或 Perl 如何在 Windows 上实现 open……不完全确定)已将强制锁定滚入 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可能会有所帮助。

于 2011-04-07T06:19:40.827 回答
4

根据文档,它不应该被锁定。你的操作系统是什么?我想知道您是否使用的是 Windows,尽管 shebang 行不建议这样做。因此,有关您的环境的更多详细信息会有所帮助。

于 2011-04-06T15:12:06.840 回答