每当在Linux中使用inode创建新文件时,如何获取文件名以及文件的绝对路径?

维卡斯奇布

我在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文件,因为数据没有更改(未写入文件)。

哪种更适合您的需求取决于细节。例如,某个工具可能会在启动时打开日志文件,直到以后再写入日志文件。在这种情况下,以上两种方式的行为将有所不同。所有这些都应在您的特定条件下仔细研究。

我们可能会想到一种竞争条件,因为虽然代码执行时其他文件可能会滑入。但是该模块远胜于此,并且在处理程序完成后它确实报告新的更改。我通过在代码运行(和休眠)并创建报告时创建文件进行了测试。

事件驱动编程的其他一些著名框架是POEIO :: Async

文件::监视器做这方面的工作了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

给定文件名获取其绝对路径

nodejs从绝对路径获取文件名?

使用Python pathlib获取没有文件名的文件的绝对路径

如何在Linux中使用'find'命令获取找到的文件的绝对路径?

如何使用JavaFX从树形视图的绝对路径中获取文件夹或文件名?

如何获取文件的绝对路径

在绝对路径中使用通配符创建文件

如何获取当前javascript文件名的绝对路径

拷贝文件时如何获取拷贝的绝对路径?

如何使用正则表达式从绝对路径中提取文件名

vimrc函数在文件中使用文字“ *”搜索文件名,该文件包含所有具有绝对路径的项目文件名的列表

如何使用jfilechooser从Java中的文件名数组中获取多个文件选择的绝对路径

获取文件名和绝对路径的问题-Laravel 5 PHP

设置输出文件名/Gradle 时不支持绝对路径

如何使用文件的绝对路径打开文件?

获取文件的绝对路径

如何获取文件目录的绝对路径?

如何在Java中获取文件的绝对路径

如何从InputStream获取Java文件的绝对路径?

如何从SWT中的FileDialog获取文件的绝对路径?

如何在flutter中获取文件的绝对路径

Python:如何获取调用函数的文件的绝对路径?

从相对路径和/或文件名解析绝对路径

使用'find'命令获取文件的绝对路径

使用批处理脚本获取文件的绝对路径

使用JavaScript在MVC中获取文件的绝对路径

删除或仅使用相对路径或文件名替换EAssertionFailed的绝对路径吗?

如何在unix中使用expr从存储在变量中的文件的绝对路径名中提取父目录?

如何在Powershell脚本中解析相对或绝对文件名输入参数的绝对路径?