Inotify - 文件系统变化通知¶
是一个 Linux内核2.6.13开始引入的文件变化通知机制,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。 [1]
inotify C API¶
Inotify 提供 3 个系统调用 [2]
inotify_init()¶
在内核中创建 inotify 子系统的一个实例,失败则返回 -1,成功的话将返回一个文件描述符,调用 read() 等待警告。read()返回struct inotify_event 事件结构:
struct inotify_event
{
int wd; /* Watch descriptor */
uint32_t mask; /* Mask of events */
uint32_t cookie; /* Unique cookie associating related events (for rename(2)) */
uint32_t len; /* Size of name field */
char name[]; /* Optional null-terminated name */
};
inotify_add_watch()¶
用于添加监视器。每个监视器必须提供一个路径名和相关事件列表,要监控多个事件,只需在事件之间使用逻辑操作符或 — C 语言中的管道线(|)操作符
inotify_add_watch( fd, "/home/strike", IN_MODIFY | IN_CREATE | IN_DELETE );
该调用会返回一个惟一的标识符,使用这个标识符更改或删除相关的监视器。如果调用失败返回 -1。
事件列表:
- IN_ACCESS: 文件被访问;
- IN_MODIFY: 文件被修改;
- IN_ATTRIB: 文件属性被修改,如 chmod、chown、touch 等;
- IN_CLOSE_WRITE: 可写文件被关闭;
- IN_CLOSE_NOWRITE: 不可写文件被关闭;
- IN_CLOSE: 文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) ;
- IN_OPEN: 文件被打开;
- IN_MOVED_FROM: 文件被移走,如 mv ;
- IN_MOVED_TO: 文件被移来,如 mv、cp ;
- IN_MOVE: 文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO);
- IN_CREATE: 创建新文件;
- IN_DELETE: 文件被删除,如 rm ;
- IN_DELETE_SELF: 自删除,即一个可执行文件在执行时删除自己;
- IN_MOVE_SELF: 自移动,即一个可执行文件在执行时移动自己;
- IN_ONESHOT: 仅监控一次事件;
- IN_ONLYDIR: 只监控目录;
- IN_UNMOUNT: 宿主文件系统被 umount;
- IN_ALL_EVENTS: 以上所有事件;
inotify_rm_watch()¶
删除一个监视器。
inotify-tools¶
Inotify 工具库提供监控文件系统活动的命令行工具 [3]
apt-get install inotify-tools
该工具提供两个命令
- inotifywait 仅执行阻塞,等待 inotify 事件。
您可以监控任何一组文件和目录,或监控整个目录树(目录、子目录、子目录的子目录等等)。
inotifywait -rme modify,attrib,move,close_write,create,delete,delete_self path
- inotifywatch 收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。
inotifywatch [OPTION] FILE
参考文献
[1] | inotify - 维基百科,自由的百科全书 |
[2] | 使用 inotify 监控文件系统的活动 |
[3] | Inotify: 高效、实时的Linux文件系统事件监控框架 |