用 perl 观察文件变化(macos 和 linux)
watching files for changes with perl (macos and linux)
我想查看一组文件的更改,这样做不会消耗大量 CPU 和电池电量。理想情况下,我的 perl 代码在 macos 和 linux 上都会 运行,但前者更重要。我试过了
我试过 Mac::FSEvents
,它在 macOS 上工作,似乎对目录很有效,但据我所知不适用于文件。
my $fs = Mac::FSEvents->new('try.txt');
my $fh= $fs->watch;
my $sel = IO::Select->new($fh);
while ( $sel->can_read ) {
my @events = $fs->read_events;
for my $event ( @events ) {
printf "File %s changed\n", $event->path;
}
}
根本没有反应;更有希望的 OS 不可知论者
use File::Monitor;
my $monitor = File::Monitor->new();
my @files= qw(try.txt);
foreach (@files) { $monitor->watch($_); }
消耗 100% CPU。 $monitor-watch()
单独不会阻塞。我也试过了
use File::Monitor;
my $monitor = File::Monitor->new();
$monitor->watch('try.txt', sub {
my ($name, $event, $change) = @_;
print "file has changed\n";
});
但这立即returns。
我找到了另一个,
use File::ChangeNotify;
my $watcher =
File::ChangeNotify->instantiate_watcher
( directories => [ './' ],
filter => qr/try\.txt/,
);
# blocking
while ( my @events = $watcher->wait_for_events() ) {
print "file has changed\n";
}
但是 CPU 利用率再次很高 (70%)。
也许这些都是错误的 cpan 模块。有人可以给我一些建议吗?
问候,
/iaw
部分(特定于 macos 的)示例:
use IO::Select;
use Mac::FSEvents;
my $fs = Mac::FSEvents->new(
path => ['./try.txt', './try2.txt'],
file_events => 1,
);
my $fh= $fs->watch;
my $sel = IO::Select->new($fh);
while ( $sel->can_read ) {
my @events = $fs->read_events;
for my $event ( @events ) {
printf "File %s changed\n", $event->path;
}
}
(即,它需要 file_events 标志。)
我想查看一组文件的更改,这样做不会消耗大量 CPU 和电池电量。理想情况下,我的 perl 代码在 macos 和 linux 上都会 运行,但前者更重要。我试过了
我试过 Mac::FSEvents
,它在 macOS 上工作,似乎对目录很有效,但据我所知不适用于文件。
my $fs = Mac::FSEvents->new('try.txt');
my $fh= $fs->watch;
my $sel = IO::Select->new($fh);
while ( $sel->can_read ) {
my @events = $fs->read_events;
for my $event ( @events ) {
printf "File %s changed\n", $event->path;
}
}
根本没有反应;更有希望的 OS 不可知论者
use File::Monitor;
my $monitor = File::Monitor->new();
my @files= qw(try.txt);
foreach (@files) { $monitor->watch($_); }
消耗 100% CPU。 $monitor-watch()
单独不会阻塞。我也试过了
use File::Monitor;
my $monitor = File::Monitor->new();
$monitor->watch('try.txt', sub {
my ($name, $event, $change) = @_;
print "file has changed\n";
});
但这立即returns。
我找到了另一个,
use File::ChangeNotify;
my $watcher =
File::ChangeNotify->instantiate_watcher
( directories => [ './' ],
filter => qr/try\.txt/,
);
# blocking
while ( my @events = $watcher->wait_for_events() ) {
print "file has changed\n";
}
但是 CPU 利用率再次很高 (70%)。
也许这些都是错误的 cpan 模块。有人可以给我一些建议吗?
问候,
/iaw
部分(特定于 macos 的)示例:
use IO::Select;
use Mac::FSEvents;
my $fs = Mac::FSEvents->new(
path => ['./try.txt', './try2.txt'],
file_events => 1,
);
my $fh= $fs->watch;
my $sel = IO::Select->new($fh);
while ( $sel->can_read ) {
my @events = $fs->read_events;
for my $event ( @events ) {
printf "File %s changed\n", $event->path;
}
}
(即,它需要 file_events 标志。)