这是由于您使用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
与统计信息及其子目录有关(即,您将看到文件已被访问/移动/等,但不会告诉您文件的名称)。名称)。