2013-10-01 54 views
4

我正在編寫一個Perl腳本來監視文件的更改。Perl inotify2爲每個文件修改觸發兩次

#!/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的變化,如果我測試它像這樣:

echo abc > /tmp/foo 

爲什麼?

回答

4

要麼使用>>作爲@Lajos的VERes建議的,或觀看CLOSE_WRITE事件(即IN_CLOSE_WRITELinux::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 
+0

'裸詞 「CLOSE_WRITE」 不允許而「嚴格subs「,儘管IN_MODIFY運行時沒有抱怨。是什麼賦予了? – spraff

+1

請嘗試使用IN_CLOSE_WRITE –

4

>首先截斷文件(我認爲它本身也是一種修改)。試用>>。