为什么 inotifywatch 检测不到添加文件的更改?

为什么 inotifywatch 检测不到添加文件的更改?

我正在尝试/tmp使用以下方法监视我的文件夹的更改inotifywatch

sudo inotifywatch -v -r /tmp

创建几个文件 ( touch /tmp/test-1 /tmp/test-2) 后,我将终止inotifywatch(通过Ctrl-C这向我显示了以下统计信息:

Establishing watches...
Setting up watch(es) on /tmp
OK, /tmp is now being watched.
Total of 39 watches.
Finished establishing watches, now collecting statistics.
total  attrib  close_write  open  create  filename
8      2       2            2     2       /tmp/

输出仅打印统计信息,但不打印我期望的文件(如这里或者这里)。我尝试了不同类型的访问(通过catmktemp等),但结果是一样的。

我错过了什么?是因为我使用的是 VPS 并且某些内容受到了限制?

操作系统:VPS 上的 Debian 7.3 (inotify-tools)

答案1

这是由于您使用的方式inotifywatch以及该工具本身的工作方式造成的。当你跑步时inotifywatch -r /tmp,你开始观看/tmp所有的文件已经在里面。当您在 内创建文件时/tmp,目录元数据将更新以包含新文件的索引节点号,这意味着更改发生在/tmp,而不是/tmp/test-1。此外,由于启动/tmp/test-1时并不在那里,因此上面inotifywatch没有放置手表。inotify这意味着在放置手表后创建的文件上发生的任何事件都不会被检测到。如果你自己亲眼所见,你可能会更明白:

$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n

如果你有启用跟踪机制inotify_add_watch(2),最后一个命令将为您提供 所设置的手表数量inotifywatch。该数字应与其本身给出的数字相同inotifywatch。现在,在里面创建一个文件/tmp并再次检查:

$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n

该数字不会增加,这意味着新文件不会被观看。请注意,如果您创建目录,则行为会有所不同:

$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1

-r这是由于开关的行为方式造成的:

-r, --recursive: [...] 如果在监视目录中创建新目录他们会自动受到监视。

编辑:我对你的两个例子有点困惑,但是在第一种情况下,手表被正确放置,因为用户调用inotifywatch~/*(已展开,请参阅此处 don_crissti 的评论)。主目录也会被监视,因为~/.*包含~/..理论上,它还应该包含~/..,它与开关结合-r,应该可以监视整个系统。

然而,它可以获取触发的文件的名称创造事件在监视的目录中,但我猜测inotifywatch不会检索此信息(它保存得比目录名称更深一点)。inotify-tools提供了另一个工具,称为inotifywait,它的行为非常类似于inotify-watch,并提供更多输出选项(包括%f,这就是您在这里寻找的):

inotifywait -m --format "%e %f" /tmp

手册页:

--format <fmt>使用类似 printf 的语法以用户指定的格式输出。 [...] 支持以下转换:

%f:当目录中发生事件时,这将替换为导致事件发生的文件的名称

%e:替换为发生的事件,以逗号分隔。

此外,-m选项(监视器)将inotifywait在第一个事件后继续运行,这将重现与 非常相似的行为inotifywatch

相关内容