Linux::Inotify2 でディレクトリを監視してなんかする

あるディレクトリにファイルが置かれたら何かしたい、
みたいにディレクトリを監視して処理を行いたい場合、Linux::Inotify2 が便利ですね。
もちろん、inotify が利用できる環境でしか使えませんが。


下は、ホームディレクトリの”backup”ディレクトリにファイルを置くと"backup_server"にそのファイルをscpします。

watch_and_scp.pl

#!/usr/bin/perl
use strict;
use warnings;

use Linux::Inotify2;

my $watch_dir = $ENV{HOME} . '/backup';
my $inotify = Linux::Inotify2->new or die $!;

$inotify->watch(
    $watch_dir,
    IN_CLOSE_WRITE | IN_MOVED_TO,
    sub {
        my $e    = shift;
        my $name = $e->fullname;
        print $name, "\n";
        system( 'scp', $name, "backup_server:~/backup/" );
    }
);
1 while $inotify->poll;

ちなみに最後の一行部分は、AnyEvent を使って次のようにも書けますね。

my $inotify_w = AnyEvent->io(
    fh   => $inotify->fileno,
    poll => 'r',
    cb   => sub { $inotify->poll }
);
AnyEvent->condvar->recv;

Linux::Inotify2のドキュメントの通りだと動かなかったので注意(fhの指定とか)


あわせて読みたい -> man inotify