男人inotify等待:
delete_self 监视的文件或目录已被删除。在此事件之后,将不再监视文件或目录。请注意,即使没有显式侦听此事件,也可能会发生该事件。
unmount 被监视的文件或目录所在的文件系统已被卸载。在此事件之后,将不再监视文件或目录。请注意,即使没有显式侦听此事件,也可能会发生该事件。
如何理解该手册页上“即使没有明确监听该事件也可能发生”的含义?
https://manpages.debian.org/stretch/inotify-tools/inotifywait.1.en.html
答案1
当您要求 inotifywait 等待事件(即不在--monitor
模式中),并且指定一种或多种事件类型(使用选项--event
)时,它通常不会退出,直到该特定事件发生。例如:
$ touch foo
$ inotifywait -e access foo
Setting up watches.
Watches established.
$ echo >>foo
$ cat foo
foo ACCESS
$ $ echo $?
0
$
(两列代表单独的终端,插入空行以使事件按时间顺序显示。)这里,建立监视后foo
,有一个 MODIFY 事件,但由于 on 的事件过滤器inotifywait
不包括 MODIFY,什么都没发生。该inotifywait
命令仅在 ACCESS 事件发生后返回。
现在假设该文件在监视访问时被删除。
$ inotifywait -e access foo
Setting up watches.
Watches established.
$ rm foo
$ $ echo $?
1
$
删除 foo 会触发 DELETE_SELF 事件。该inotifywait
命令看到此事件。它不会打印它,因为它被告知只报告 ACCESS 事件。但inotifywait
退出:它确实对事件进行了计数,即使它不在过滤器中。该命令以状态 1 退出,表示“发生了未侦听的事件”(并且不像大多数未监视事件那样被忽略)。
答案2
这意味着即使您使用了该-e
选项但未指定它们,您也可以获得这些事件。例如,如果您使用
inotifywait -e modify filename
并且文件被删除,您将收到一个delete_self
事件,即使您只请求modify
事件。
这意味着您需要检查输出中的事件类型,即使您只请求了特定事件。