我在Linux操作系统(CentOS)上进行了一些实验,我想跟踪在相同环境下创建的所有工具日志,工具生成用于跟踪这些更改的相应日志(.log extn),我编写了一个perl watcher,它实际上在监视目录我设置的值,当创建新文件时,它将显示在输出中,但这会消耗大量内存和CPU利用率,因为我将2sec设置为睡眠时间。
我的问题“还有更好的方法吗?” 我想到了使用inode表来跟踪系统中的所有更改。这可以解决我的问题吗?如果是的话,可以让我们知道解决方案吗?
似乎您想监视目录中的更改。这是一项复杂的工作,但是有很好的模块。最容易推荐的一种可能是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;
如果您只关心新文件,则上面只需要一个常量。对于这两种类型的事件,$name
都具有新文件的名称。从man inotify
我的系统上
...
name
返回的inotify_event
结构中的字段标识目录中文件的名称。
该inotify_event
结构由Linux::Inotify2::Watcher
对象适当地表示。
IN_CREATE
对于您的目的,使用似乎是显而易见的解决方案。我创建了两个文件,并echo
在同一命令行上用分号分隔了两个重定向命令,并通过touch
-ing一个文件来进行测试。写入的文件被检测为单独的事件,touch
-ed文件也被检测为事件。
IN_MODIFY
由于它可以监视(在中$dir
),因此使用也可能有效
...被监视对象(始终是目录)中的任何文件系统对象,即文件,目录,符号链接,设备节点等。
对于测试,由echo
上面编写的两个文件都作为单独的事件报告。但不会报告touch
-ed文件,因为数据没有更改(未写入文件)。
哪种更适合您的需求取决于细节。例如,某个工具可能会在启动时打开日志文件,直到以后再写入日志文件。在这种情况下,以上两种方式的行为将有所不同。所有这些都应在您的特定条件下仔细研究。
我们可能会想到一种竞争条件,因为虽然代码执行时其他文件可能会滑入。但是该模块远胜于此,并且在处理程序完成后它确实报告新的更改。我通过在代码运行(和休眠)并创建报告时创建文件进行了测试。
事件驱动编程的其他一些著名框架是POE和IO :: Async。
该文件::监视器做这方面的工作了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句