看来您想监视目录的更改。这是一项复杂的工作,但有很好的模块。最容易推荐的可能是Linux::Inotify2
该模块实现了 Linux 2.6.13 及更高版本 Inotify 文件/目录更改通知系统的接口。
这似乎符合你想要的。
任何此类监视器都需要额外的事件处理。本示例使用AnyEvent.
use warnings;
use strict;
use feature 'say';
use AnyEvent;
use Linux::Inotify2;
my $dir = 'dir_to_watch';
my $inotify = Linux::Inotify2->new or die "Can't create inotify object: $!";
$inotify->watch( $dir, IN_MODIFY | IN_CREATE, sub {
my $e = shift;
my $name = $e->fullname;
say "$name modified" if $e->IN_MODIFY; # Both show the new file
say "$name created" if $e->IN_CREATE; # but see comments below
});
my $inotify_w = AnyEvent->io (
fh => $inotify->fileno, poll => 'r', cb => sub { $inotify->poll }
);
1 while $inotify->poll;
如果你只关心new文件,那么你只需要上面的一个常量。
对于这两种类型的事件$name
有新文件的名称。从man inotify
在我的系统上
... the name
返回的字段inotify_event
结构标识目录中文件的名称。
The inotify_event
结构适当地表示为Linux::Inotify2::Watcher
object.
Using IN_CREATE
对于您的目的来说似乎是一个明显的解决方案。我通过创建两个文件进行测试,其中两个文件重定向echo
在同一命令行上用分号分隔的命令,也可以用touch
-ing 一个文件。写入的文件被检测为单独的事件,因此touch
-ed 文件。
Using IN_MODIFY
也可能有效,因为它监视(在$dir
)
...监视对象中的任何文件系统对象(始终是目录),即文件、目录、符号链接、设备节点等...
至于测试,这两个文件都是由echo
如上所述,作为单独的事件进行了报道。但一个touch
-ed 文件是not报告,因为数据没有更改(文件没有写入)。
哪种更适合您的需求取决于细节。例如,工具可能会在启动时打开日志文件,但稍后才写入该文件。在这种情况下,上述两种方式的表现会有所不同。所有这些都应该根据您的具体情况仔细调查。
我们可能会想到竞争条件,因为当代码执行其他文件时可能会滑入。但该模块比这要好得多,并且它确实在处理程序完成后报告新的更改。我通过在代码运行(和睡眠)时创建文件进行测试并报告它们。
其他一些值得注意的事件驱动编程框架是POE and IO::异步.
The 文件::监视器也做这种工作。