每当使用 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也做这种工作。