Perl inotify2 每次文件修改触发两次

Posted

技术标签:

【中文标题】Perl inotify2 每次文件修改触发两次【英文标题】:Perl inotify2 triggers twice for each file modification 【发布时间】:2013-10-01 12:18:45 【问题描述】:

我正在编写一个监视文件更改的 Perl 脚本。

#!/usr/bin/perl
use strict;
use Linux::Inotify2;

my $inotify = new Linux::Inotify2 or die $!;
my $filename = "/tmp/foo";
my $counter = 0;

$inotify->watch (
    $filename,
    IN_MODIFY,
    sub 
        ++$counter;
        print "changed: $counter\n";
    
) or die $!;

1 while $inotify->poll;

如果我像这样测试它,则每次 /tmp/foo 更改时都会调用此处理程序两次(增加 $counter 两次):

echo abc > /tmp/foo

为什么?

【问题讨论】:

【参考方案1】:

按照@Lajos Veres 的建议使用>>,或者观看CLOSE_WRITE 事件(即IN_CLOSE_WRITE 用于Linux::Inotify2 模块),

echo > /tmp/foo

inotifywait -m /tmp/foo
Setting up watches.
Watches established.
/tmp/foo MODIFY
/tmp/foo OPEN
/tmp/foo MODIFY
/tmp/foo CLOSE_WRITE,CLOSE

【讨论】:

Bareword "CLOSE_WRITE" not allowed while "strict subs" 尽管 IN_MODIFY 运行没有任何抱怨。什么给了? 试试 IN_CLOSE_WRITE【参考方案2】:

> 首先截断文件(我认为它本身也是修改)。试试>>。

【讨论】:

以上是关于Perl inotify2 每次文件修改触发两次的主要内容,如果未能解决你的问题,请参考以下文章

使用 Perl 和 Linux::Inotify2 模块监控 Mac 地址的日志文件

Perl Linux::Inotify2 - 不能再响应事件了

为啥inotify会丢失事件?

每次触发警报时,连接到逻辑应用 Webhook 的 Azure 警报操作都会触发两次

在后台运行的单个 perl 脚本可以保存多个 Log4Perl 实例吗?

套接字IO - socket.emit每次触发两次事件