linux inotify - 文件系统监控

Inotify是一个监控API,负责监视文件系统事件,可监视单个文件、目录及子目录。

使用inotify,内核版本需大于等于2.6.13。

可检查/usr/include/sys/inotify.h文件,若存在,则内核可能支持inotify。

Inotify API

Inotify提供三个系统调用,构建文件系统监视器:

inotify_init()

创建inotify子系统实例,在成功时返回文件描述符,失败时返回-1。

与其他系统调用一样,若inotify_init()失败,检查errno获取诊断信息。

inotify_add_watch()

添加一个监控,每个监控必须提供一个路径名和一个相关事件列表,每个事件都由一个常量(如INMODIFY)指定。

要监视多个事件,每个事件之间使用c中的逻辑(|)操作符。

如果inotify_add_watch()成功,调用将返回注册成功后的监控标识符。否则,返回-1。

标识符可用于更改或删除监控。

inotify_rm_watch()

删除一个监控。 

应用程序可使用inotify监视和缓存一组文件系统对象状态。

inotify-tools

inotify API不可用的场景中,可选用如下两个inotify工具。

inotifywait

监控文件、目录的变化。

阻塞等待inotify事件。可以监视任何文件和目录列表,并监视整个目录树(目录,子目录)。

inotifywait在shell脚本中使用。

inotifywatch

收集有关受监视文件系统的统计信息,统计文件系统访问次数。

安装inotify-tools

yum install inotify-tools

监控目录

inotifywait -m /tmp

监视tmp目录。

inotifywait -r -m $HOME

监视整个主目录中的更改,-r递归地监视子目录,-m在每个事件后运行。

使用-e选项注册感兴趣的事件过滤输出结果:

access		    create		 move_self
attrib		    delete		 moved_to
close_write	    delete_self  moved_from
close_nowrite	modify		 open
close		    move		 unmount

dnotify、inotify和fanotify

Inotify实现了dnotify,fanotify正慢慢崛起,已在内核2.6.36中引入。