一、Inotify 简介
在日常的运维过程中,经常需要备份某些文件,或者对系统的某些文件进行监控,比如重要的配置文件等。如果需要作到实时同步或者监控,就需要使用内核的inotify机制
Inotify 是基于inode级别的文件系统监控技术,是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能
- Inotify 不需要对被监视的目标打开文件描述符,而且如果被监视目标在可移动介质上,那么在 umount 该介质上的文件系统后,被监视目标对应的 watch 将被自动删除,并且会产生一个 umount 事件。
- Inotify 既可以监视文件,也可以监视目录。
- Inotify 使用系统调用而非 SIGIO 来通知文件系统事件。
- Inotify 使用文件描述符作为接口,因而可以使用通常的文件 I/O 操作select 和 poll 来监视文件系统的变化。
inotify主要功能:是一个内核用于通知用户空间程序文件系统变化的机制。
二、 Inotify 可监视的文件系统事件
- IN_ACCESS : 即文件被访问
- IN_MODIFY : 文件被修改
- IN_MODIFY_SELF : 移动受监控目录或文件本身
- 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)
- IN_ONESHOT : 只监控pathname的一个事件
- IN_ONLYDIR : pathname不为目录时会失败
注:上面所说的文件也包括目录
对于上述一些事件的说明:
- 当文件的元数据(比如,权限,所有权,链接计数,扩展属性,用户ID,或组ID等)改变时,会发生IN_ATTRIB事件
- 删除受监控对象时会发生IN_DELETE_SELF
- 重命名对象时会发生IN_MORE_SELF事件
- IN_ONESHOT 允许只监控pathname的一个事件,事件发生后,监控项会自动从监控列表消失
三、版本是否支持Inotify内核
看看是否有 /proc/sys/fs/inotify/目录,以确定内核是否支持inotify
[root@mail ~]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r--1 root root 0 Apr 20 23:24 max_queued_events
-rw-r--r--1 root root 0 Apr 20 23:24 max_user_instances
-rw-r--r--1 root root 0 Apr 20 23:24 max_user_watches
文件说明:
- max_user_watches:设置initifywait或inotifywatch命令可以监视的文件数量(单进程)
- max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
- max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量
注意: max_queued_events 是 Inotify 管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大。
如果你在日志中看到Event Queue Overflow,说明max_queued_events太小需要调整参数后再次使用。