vik*_*hib 3 linux perl inode file-management centos6
我在我的linux OS(CentOS)上做了一些实验,我想跟踪在同一环境下创建的所有工具日志,工具生成相应的日志(.log extn)来跟踪这些更改我写了一个实际监控目录的perl观察器我设置的时间以及创建新文件时它将在输出中显示但由于我将2秒设置为休眠期,因此消耗了大量内存和CPU利用率.
我的问题"有没有更好的方法呢?" 我想过使用inode表来跟踪系统中的所有变化.这可以解决我的问题吗?如果是,那么请告诉我们相同的解决方案吗?
zdi*_*dim 10
您似乎想要监视目录以进行更改.这是一项复杂的工作,但有很好的模块.最容易推荐的可能是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;
Run Code Online (Sandbox Code Playgroud)
如果你只关心新文件,那么你只需要一个常数.对于这两种类型的事件,$name都具有新文件的名称.来自man inotify我的系统
...
name返回inotify_event结构中的字段标识目录中文件的名称.
该inotify_event结构适当地由Linux::Inotify2::Watcher物体表示.
使用IN_CREATE似乎是一个明显的解决方案,为您的目的.我通过创建两个文件进行测试,echo在同一命令行上使用分号分隔两个重定向命令,并且还通过touch文件进行测试.写入的文件被检测为单独的事件,touch-ed文件也是如此.
使用IN_MODIFY也可以工作,因为它监视(在$dir)
...监视对象中的任何文件系统对象(总是一个目录),即文件,目录,符号链接,设备节点等......
对于测试,echo如上所述编写的文件都作为单独的事件报告.但是没有报告touch-ed文件,因为数据没有改变(文件没有被写入).
哪种更适合您的需求取决于细节.例如,一个工具可能会在启动时打开一个日志文件,只是稍后写入它.在这种情况下,上述两种方式的行为会有所不同.所有这些都应该在您的具体条件下仔细调查.
我们可能会想到一个竞争条件,因为虽然代码执行其他文件可能会滑入.但是模块远远好于它,它会在处理程序完成后报告新的更改.我通过在代码运行(和睡眠)时创建文件进行测试并报告它们.
其他一些值得注意的事件驱动编程框架是POE和IO :: Async.
该文件::监视器做这方面的工作了.
| 归档时间: |
|
| 查看次数: |
384 次 |
| 最近记录: |