Watch 使用perl(macos和linux)监视文件的更改

Watch 使用perl(macos和linux)监视文件的更改,watch,inotify,Watch,Inotify,我想看一组文件的变化,这样做没有一个大的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_r

我想看一组文件的变化,这样做没有一个大的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;
  }
}
根本没有反应;而更具前景的操作系统不可知论者

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";
                });
但这种情况马上就会出现

我找到了另一个

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模块。有人能给我一些建议我该怎么做吗

问候,

/法律部分(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;
  }
}