每当使用 linux 中的 inode 创建新文件时,如何获取文件名以及文件的绝对路径?
how to get the filename along with absolute path to the file, whenever a new file is created using inode in linux?
我用我的 linux OS (CentOS) 做了一些实验,我想跟踪在同一环境下创建的所有工具日志,工具生成相应的日志 ( .log extn) 用于跟踪这些更改我写了一个 perl 观察器,它实际上监视我设置的目录,当创建新文件时它将显示在输出中但这会消耗大量内存和 CPU 利用率我设置了2秒的睡眠时间
我的问题"Is there any better of way doing this ?" 我想过使用 inode table 来跟踪系统中的所有更改。这可以解决我的问题吗?如果是,那么能否让我们知道相同的解决方案?
您似乎想要监视目录的更改。这是一项复杂的工作,但是有很好的模块。最容易推荐的可能是 Linux::Inotify2
This module implements an interface to the Linux 2.6.13 and later Inotify file/directory change notification system.
这似乎符合您的要求。
任何此类监视器都需要额外的事件处理。此示例使用 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
field in the returned inotify_event
structure identifies the name of the file within the directory.
inotify_event
结构由 Linux::Inotify2::Watcher
对象适当表示。
使用 IN_CREATE
似乎是满足您的目的的明显解决方案。我通过创建两个文件进行测试,两个重定向的 echo
命令在同一命令行上用分号分隔,还通过 touch
-ing 一个文件。写入的文件被检测为单独的事件,touch
-ed 文件也是如此。
使用 IN_MODIFY
也可能有效,因为它监控(在 $dir
中)
... any file system object in the watched object (always a directory), that is files, directories, symlinks, device nodes etc. ...
至于测试,上述 echo
编写的两个文件都作为单独的事件报告。但是touch
编辑的文件没有报告,因为数据没有改变(文件没有被写入)。
哪个更适合您的需求取决于细节。例如,一个工具可能会在启动时打开一个日志文件,只是在很久以后才写入它。在这种情况下,上述两种方式的行为会有所不同。所有这些都应该根据您的具体情况仔细调查。
我们可能会想到竞争条件,因为当代码执行时,其他文件可能会滑入。但该模块比这要好得多,它确实会在处理程序完成后报告新的更改。我通过在代码运行(和休眠)时创建文件进行测试,并报告它们。
其他一些著名的事件驱动编程框架是 POE and IO::Async。
File::Monitor也做这种工作。
我用我的 linux OS (CentOS) 做了一些实验,我想跟踪在同一环境下创建的所有工具日志,工具生成相应的日志 ( .log extn) 用于跟踪这些更改我写了一个 perl 观察器,它实际上监视我设置的目录,当创建新文件时它将显示在输出中但这会消耗大量内存和 CPU 利用率我设置了2秒的睡眠时间
我的问题"Is there any better of way doing this ?" 我想过使用 inode table 来跟踪系统中的所有更改。这可以解决我的问题吗?如果是,那么能否让我们知道相同的解决方案?
您似乎想要监视目录的更改。这是一项复杂的工作,但是有很好的模块。最容易推荐的可能是 Linux::Inotify2
This module implements an interface to the Linux 2.6.13 and later Inotify file/directory change notification system.
这似乎符合您的要求。
任何此类监视器都需要额外的事件处理。此示例使用 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
field in the returnedinotify_event
structure identifies the name of the file within the directory.
inotify_event
结构由 Linux::Inotify2::Watcher
对象适当表示。
使用 IN_CREATE
似乎是满足您的目的的明显解决方案。我通过创建两个文件进行测试,两个重定向的 echo
命令在同一命令行上用分号分隔,还通过 touch
-ing 一个文件。写入的文件被检测为单独的事件,touch
-ed 文件也是如此。
使用 IN_MODIFY
也可能有效,因为它监控(在 $dir
中)
... any file system object in the watched object (always a directory), that is files, directories, symlinks, device nodes etc. ...
至于测试,上述 echo
编写的两个文件都作为单独的事件报告。但是touch
编辑的文件没有报告,因为数据没有改变(文件没有被写入)。
哪个更适合您的需求取决于细节。例如,一个工具可能会在启动时打开一个日志文件,只是在很久以后才写入它。在这种情况下,上述两种方式的行为会有所不同。所有这些都应该根据您的具体情况仔细调查。
我们可能会想到竞争条件,因为当代码执行时,其他文件可能会滑入。但该模块比这要好得多,它确实会在处理程序完成后报告新的更改。我通过在代码运行(和休眠)时创建文件进行测试,并报告它们。
其他一些著名的事件驱动编程框架是 POE and IO::Async。
File::Monitor也做这种工作。