如何监控Linux文件系统事件:inotify使用指南(1)(4)
用法举例
在本部分中,我们创建一个带有文件的简单双级目录结构,然后运行简单程序来举例说明 inotify 所能监控的一些事件。我们将在终端会话中启动 inotify 示例程序,但是在后台运行使用 &)因此程序的输出与我们输入的命令会交替出现。您可以在一个终端窗口运行该程序,而在其他一个或多个窗口运行指令。清单 9 展示了简单文件结构和空文件的创建,以及最初启动该示例程序时的输出。
清单 9. 创建一个样例环境
ian@attic4:~/inotify-sample$ mkdir -p dir1/dir2 ian@attic4:~/inotify-sample$ touch dir1/dir2/file1 ian@attic4:~/inotify-sample$ ./inotify_test dir1/ dir1/dir2/ dir1/dir2/file1& [2] 8733 ian@attic4:~/inotify-sample$ Watching dir1/ WD=1 Watching = 1 items Watching dir1/dir2/ WD=2 Watching = 2 items Watching dir1/dir2/file1 WD=3 Watching = 3 items ian@attic4:~/inotify-sample$
在清单 10 中,展示了来自 dir2 内容清单的输出。第一个事件报告是关于 dir1 的,展示了一些内容,即 dir2 ,在被监控描述符 1 监控的目录当中被打开了。第二个条目是关于监控描述符 2 的,显示出被监控项目在本例中为 dir2 )被打开了。如果正在监控目录树中的多个项目,可能会经常遇到这种双重输出。
清单 10. 列举 dir2 的内容
ian@attic4:~/inotify-sample$ ls dir1/dir2 file1 4 events queued OPEN: Dir "dir2" on WD #1 OPEN: Dir "(null)" on WD #2 CLOSE_NOWRITE: Dir "dir2" on WD #1 CLOSE_NOWRITE: Dir "(null)" on WD #2
在清单 11 中,我们在 file1 添加了一些文本。请再次注意对文件以及该文件所在目录的双重打开、关闭和修改事件。还请注意所有的事件并非立刻读取。排队例程被调用了3次,每次有两个事件。如果再次运行该程序,并且每次操作相同,您未必会再次遇到这一特别情况。
清单 11. 在 file1 中添加文本
ian@attic4:~/inotify-sample$ echo "Some text" >> dir1/dir2/file1 2 events queued OPEN: File "file1" on WD #2 OPEN: File "(null)" on WD #3 2 events queued MODIFY: File "file1" on WD #2 MODIFY: File "(null)" on WD #3 2 events queued CLOSE_WRITE: File "file1" on WD #2 CLOSE_WRITE: File "(null)" on WD #3
在清单 12 中,我们改变了 file1 的属性。我们再次得到有关被监控项目以及其所在目录的双重输出。
清单 12. 改变文件属性
ian@attic4:~/inotify-sample$ chmod a+w dir1/dir2/file1 2 events queued ATTRIB: File "file1" on WD #2 ATTRIB: File "(null)" on WD #3
现在将文件 file1 移动到上一级目录 dir1 当中。在清单 13 中显示了输出结果。这次没有双重条目。我们实际上得到了 3 个条目,每个目录一个,文件本身一个。请注意 cookie (569) 允许将 MOVED-FROM 事件与 MOVED_TO 事件关联起来。
清单 13. 将 file1 移动到 dir1
ian@attic4:~/inotify-sample$ mv dir1/dir2/file1 dir1 3 events queued MOVED_FROM: File "file1" on WD #2. Cookie=569 MOVED_TO: File "file1" on WD #1. Cookie=569 MOVE_SELF: File "(null)" on WD #3
现在创建一个 file1 到 file2 的硬链接。当到 inode 的链接数量该变时,我们会有一个关于 file1 的 ATTRIB 事件,还会有一个关于 file2 的 CREATE 事件。
清单 14. 创建硬链接
ian@attic4:~/inotify-sample$ ln dir1/file1 dir1/file2 2 events queued ATTRIB: File "(null)" on WD #3 CREATE: File "file2" on WD #1
现在将文件 file1 移入当前目录,将其重命名为 file3 。当前目录没有被监控,因此不存在与 MOVED_FROM 事件相关联的 MOVED_TO 事件。
清单 15. 将 file1 移入不受监控的目录当中
ian@attic4:~/inotify-sample$ mv dir1/file1 ./file3 2 events queued MOVED_FROM: File "file1" on WD #1. Cookie=572 MOVE_SELF: File "(null)" on WD #3
此时,dir2 是空的,因此可以移动它。注意我们得到一个关于监控描述符 2 的 IGNORED 事件,可见现在我们只监控两个项目。
清单 16. 移除 dir2
ian@attic4:~/inotify-sample$ rmdir dir1/dir2 3 events queued DELETE: Dir "dir2" on WD #1 DELETE_SELF: File "(null)" on WD #2 IGNORED: WD #2 Watching = 2 items
移除文件 file3。注意这次我们没有得到 IGNORED 事件。为什么呢?为什么得到了关于 file 3 的 ATTRIB 事件就是原来的 dir1/dir2/file1)?
清单 16. 删除 file3
ian@attic4:~/inotify-sample$ rm file3 1 events queued ATTRIB: File "(null)" on WD #3
记住我们创建了 file1 到 file2 的硬链接。清单 17 显示我们还在通过监控描述符 3 来监控 file2,尽管最开始不存在文件 2!
ian@attic4:~/inotify-sample$ touch dir1/file2 6 events queued OPEN: File "file2" on WD #1 OPEN: File "(null)" on WD #3 ATTRIB: File "file2" on WD #1 ATTRIB: File "(null)" on WD #3 CLOSE_WRITE: File "file2" on WD #1 CLOSE_WRITE: File "(null)" on WD #3
因此,现在让我们来删除 dir1,并监控事件级联,因为它不再监控任何事情,不得不结束了自己。
清单 18. 删除 dir1
ian@attic4:~/inotify-sample$ rm -rf dir1 8 events queued OPEN: Dir "(null)" on WD #1 ATTRIB: File "(null)" on WD #3 DELETE_SELF: File "(null)" on WD #3 IGNORED: WD #3 Watching = 1 items DELETE: File "file2" on WD #1 CLOSE_NOWRITE: Dir "(null)" on WD #1 DELETE_SELF: File "(null)" on WD #1 IGNORED: WD #1 Watching = 0 items Terminating
评论暂时关闭