Inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。您还可以跟踪活动的源头和目标等细节。
作用
- 性能调优和错误定位的手段;
- 通知配置文件的改变,这个是服务器编程经常需要使用的;
- 跟踪某些关键的系统文件的变化;
- 监控某个分区磁盘的整体使用情况;
- 系统崩溃时进行自动清理;
- 自动触发备份进程;
- 向服务器上传文件结束时发出通知
注意:
(1) inotify API是linux系统调用接口,不遵循POSIX标准
(2)Linux系统内核是否达到了2.6.13以上
检查是否支持inotify的两种方法:
(1)/proc/sys/fs/inotify目录下存在max_queued_events、max_user_instances、max_user_watches文件说明系统支持inotify
(2)如果输出('CONFIG_INOTIFY_USER=y'),那么你可以马上享受Inotify之旅了。
% grep INOTIFY_USER /boot/config-$(uname -r) CONFIG_INOTIFY_USER=y
接口
#include
int inotify_init1(int flags);
int inotify_add_watch(int fd, const char *pathname, uint32_t mask);
int inotify_rm_watch(int fd, int wd);
接口不需要做什么说明,具体的细节看manpage手册,上面已经说的足够详细了。使用 inotify 很简单:创建一个文件描述符,附加一个或多个监视器(一个监视器 是一个路径和一组事件),然后使用 read 方法从描述符获取事件。read 并不会用光整个周期,它在事件发生之前是被阻塞的。更好的是,因为 inotify 通过传统的文件描述符工作,您可以利用传统的 select 系统调用来被动地监控监视器和许多其他输入源。两种方法 — 阻塞和使用 select— 都避免了繁忙轮询。
相关参数
inotify定义了下列的参数,可以用来限制inotify使用内核内存的大小。
/proc/sys/fs/inotify/max_queued_evnets
表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。
/proc/sys/fs/inotify/max_user_instances
表示每一个real user ID可创建的inotify instatnces的数量上限。
/proc/sys/fs/inotify/max_user_watches
表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小,例如:
echo 30000000 > /proc/sys/fs/inotify/max_user_watches
监视的文件系统事件
- IN_ACCESS,即文件被访问
- IN_MODIFY,文件被 write
- IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等
- IN_CLOSE_WRITE,可写文件被 close
- IN_CLOSE_NOWRITE,不可写文件被 close
- IN_OPEN,文件被 open
- IN_MOVED_FROM,文件被移走,如 mv
- IN_MOVED_TO,文件被移来,如 mv、cp
- IN_CREATE,创建新文件
- IN_DELETE,文件被删除,如 rm
- IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
- IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己
- IN_UNMOUNT,宿主文件系统被 umount
- IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
- IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)
内核实现
2.6.31版本的内核中对notify进行了一番大的改动,将原来的inotify和dnotify这两个不想关的特性进行了抽象,将它们的共同的点抽象成了一个基础设施,这个基础设施就是fsnotify.其实,fsnotify并没有什么难于理解的,它甚至比原来的inotify和dnotify更加简单了,这次的这个更新仅仅更新了机制而没有更新策略,也就是用户接口并没有任何的变化。如果说有人理解kernel中的device和device_driver体系以及input子系统的话,那么这个fsnotify就不难理解了。
notify实现机制的代码在fs/notify/下,其中fsnotify就由此目录下的fs/notify/fsnotify.h 、fs/notify/group.c、fs/notify/inode_mark.c、fs/notify/mark.c、fs/notify/notification.c、fs/notify/vfsmount_mark.c、和头文件include/linux/fsnotify.h、include/linux/fsnotify_backend.h实现。而fs/notify/dnotify/, fs/notify/fanotify/和fs/notify/inotify/则分别实现了dnotify, fanotify, inotify。
参考:
- 。