inotifywait 异步文件系统监控机制
Inotify 一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作,也就是可以监控文件发生的一切变化。
inotify-tools 是一个C库和一组命令行的工作提供Linux下inotify的简单接口。inotify-tools安装后会得到inotifywait和inotifywatch这两条命令:
inotifywait命令 可以用来收集有关文件访问信息,Linux发行版一般没有包括这个命令,需要安装inotify-tools,这个命令还需要将inotify支持编译入Linux内核,好在大多数Linux发行版都在内核中启用了inotify。
inotifywatch命令 用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。
开始之前需要检测系统内核是否支持inotify:
使用uname -r命令检查Linux内核,如果低于2.6.13,就需要重新编译内核加入inotify的支持。
使用ll /proc/sys/fs/inotify命令,是否有以下三条信息输出,如果没有表示不支持。
ll /proc/sys/fs/inotify
total 0
-rw-r--r-- 1 root root 0 Jan 4 15:41 max_queued_events
-rw-r--r-- 1 root root 0 Jan 4 15:41 max_user_instances
-rw-r--r-- 1 root root 0 Jan 4 15:41 max_user_watches
inotifywait使用
语法:inotifywait [-hcmrq] [-e ] [-t ] [–format ] [–timefmt ] [ … ]
-m:一直监控指定的目录,接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。
@:排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
-o, –outfile :输出事情到一个文件而不是标准输出。
-s, –syslog:输出错误信息到系统日志
-d, –daemon:跟–monitor一样,除了是在后台运行,需要指定–outfile把事情输出到一个文件。也意味着使用了–syslog。
–exclude :正则匹配需要排除的文件,大小写敏感。
–excludei :正则匹配需要排除的文件,忽略大小写。
-t , –timeout :设置超时时间,如果为0,则无限期地执行下去。
-r:递归监控所监控目录的子目录。
-q:指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
–timefmt:指定时间格式。
–format:
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X”分隔
%T 使用由–timefmt定义的时间格式
-e:指定监控事件项
举个例子:
/usr/bin/inotifywait -m -o log.txt --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f' -e modify,delete,create,attrib var
todo:有个问题,如果只是监控一个文件,监控一个目录就没有问题
/usr/bin/inotifywait -m -o log.txt --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f' -e modify,delete,create,attrib test.txt
log日志只会在第一次时显示,后面test.txt变化都不会记录在日志上
守护进程模式如果只监控一个文件也启动不了,查看进程并没有启动
/usr/bin/inotifywait -d -o log.txt --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f' -e modify,delete,create,attrib t.txt
/usr/bin/inotifywait -d -o log.txt --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f' -e modify var/test.txt
在守护进程模式下,-o参数和被监控的目录必须为绝对路径,否则日志不会输出
/usr/bin/inotifywait -drq -o /root/sentry/sentry.log --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f %e' -e modify,delete,create,attrib --excludei "(swp|swx)" /root/sentry/var
完整的例子:
!/bin/bash
inotifywait -drq -o /tmp/inotifywait.log --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f %e' -e modify,delete,create,attrib --excludei "(swp|swx)" /var/www | while read file; do
echo ${file}
done
守护进程下echo无效。得把-d改成-m
参考:http://wangchujiang.com/linux-command/c/inotifywait.html
https://github.com/rvoicilas/inotify-tools/issues/5
inotify 优点:
1)监控文件系统事件变化,通过同步工具实现实时数据同步。
inotify 缺点
1)并发如果大于200个文件(10-100k),同步就会有延迟
2)我们前面写的脚本,每次都是全部推送一次,但确实是增量的。也可以只同步变化的文件,不变化的不理。
3)监控到事件后,调用rsync同步是单进程的,而sersync为多进程同步。既然有了inotify-tools,为什么还要开发sersync?
serysync功能多:(inotify+rsync命令)
1)支持通过配置文件管理
2)真正的守护进程socket
3)可以对失败文件定时重传(定时任务功能)
4)第三方的HTTP接口(例如:更新cdn缓存)
5)默认多进程rsync同步
参考:https://www.cnblogs.com/chensiqiqi/p/6542268.html