【问题标题】:How do I tail a log file without locking in perl如何在不锁定 perl 的情况下跟踪日志文件
【发布时间】:2011-04-06 15:00:01
【问题描述】:

我现在就是这样做的,但它会锁定文件。

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

【问题讨论】:

    标签: windows perl file locking tail


    【解决方案1】:

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

    【讨论】:

    • 我正在使用 windows xp。当我没有运行上面的 perl 脚本时,日志不会像它们那样频繁地出现。这让我觉得它可能会锁定日志文件
    • 文档特别说明 $fileTail->read will 块。如果您不想阻止,请使用 $fileTail->select()。此答案中给出的链接中有一个完整的示例。
    • @mark - 锁定 ...不是阻塞。他说,当他的 perl 脚本跟踪日志时,日志并没有被附加。
    • 嗯 ... Windows XP ... 这可能解释了这个问题。当涉及到 perl 文件处理模块时,XP 的行为通常与服务器类操作系统不同,这些模块通常依赖于 unix 类型的行为。您可以尝试将电子邮件发送给上述文档中的模块作者。
    • @Brian - 啊哈...我不(曾经)在 Microsoft 平台上工作,因此读取文件的进程基本上会锁定它,以便其他进程无法写它是完全陌生的。我阅读了这个问题并立即映射锁定-> 阻塞。感谢您的澄清。
    【解决方案2】:

    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 可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      • 2011-03-27
      • 2019-02-06
      • 1970-01-01
      • 2014-06-16
      • 2014-11-29
      相关资源
      最近更新 更多