Inotify是一种文件变化通知机制, Linux内核从 2.6.13 开始引入.

内核支持

在使用前, 需要先检查内核是否开启了inotify的支持:

# /path/to/kernel_config 是内核的配置文件
# 比如在gentoo下, 是 `/usr/src/linux/.config` 这个文件
grep INOTIFY_USER /path/to/kernel_config

如果显示 CONFIG_INOTIFY_USER=y 则表示内核的配置里已开启支持.

然后看看 /proc/sys/fs/inotify 目录:

9:50 root@gentoo-jl /root
% ll /proc/sys/fs/inotify
total 0
dr-xr-xr-x 1 root root 0 Aug 18 07:07 .
dr-xr-xr-x 1 root root 0 Aug 18 06:42 ..
-rw-r--r-- 1 root root 0 Aug 18 07:07 max_queued_events
-rw-r--r-- 1 root root 0 Aug 18 07:07 max_user_instances
-rw-r--r-- 1 root root 0 Aug 18 07:07 max_user_watches

确保有这三个文件.

/proc/sys/fs/inotify/max_queued_events
默认值: 16384 该文件中的值为调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值得事件被丢弃,但会触发IN_Q_OVERFLOW事件
The value in this file is used when an application calls inotify_init(2) to set an upper limit on the number of events that can be queued to the corresponding inotify instance. Events in excess of this limit are dropped, but an IN_Q_OVERFLOW event is always generated.

/proc/sys/fs/inotify/max_user_instances
默认值: 128 指定了每一个real user ID可创建的inotify instatnces的数量上限
This specifies an upper limit on the number of inotify instances that can be created per real user ID.

/proc/sys/fs/inotify/max_user_watches
默认值: 8192 指定了每个inotify instance相关联的watches的上限
This specifies a limit on the number of watches that can be associated with each inotify instance.

参考 LinuxInsight

可以通过 echosysctl 更改这些值.

注意: max_queued_events 是 Inotify 管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大

如果你在日志中看到Event Queue Overflow,说明max_queued_events太小需要调整参数后再次使用.

inotify-tools

包含两个工具:

pyinotify

pyinotify 是一个 Python 的模块, 用于监控文件系统变化, 它基于 Linux Kernel 的 inotify 特性.

安装好 pyinotify 后, 可以测试一下:

python -m pyinotify -v /my-dir-to-watch

可以把 pyinotify 模块当一个脚本来执行. 然后 cd 到 /my-dir-to-watch, 就会看见监控窗口有一系列的事件日志显示.

pyinotify 的 wiki 讲的非常详细.

还有一些 inotify 的, pyinotify 的作者已经列举了这些常见的问题: Frequently Asked Questions

参考资料