这是由于您使用inotifywatch的方式以及工具本身的工作方式所致。当您运行inotifywatch -r /tmp,你开始看/tmp和所有的文件已经在里面。在内部创建文件时/tmp,目录元数据将更新为包含新文件的inode编号,这意味着更改发生在/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。
.bashrc在示例中,@serverfault不会出现在统计信息中,因为用户递归地监视其主目录,但是由于用户目录path/.*已展开,因此为path/(.bashrc包括)下的所有.file设置了监视。OP使用的命令将永远不会输出文件名,因为设置了/tmp监视对象,因此任何子目录均仅/tmp与统计信息及其子目录有关(即,您将看到文件已被访问/移动/等,但不会告诉您文件的名称)。名称)。