一、inotifywait介绍
Inotify 一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作,也就是可以监控文件发生的一切变化。
inotify-tools 是一个C库和一组命令行的工作,提供Linux下inotify的简单接口。inotify-tools安装后会得到inotifywait和inotifywatch这两条命令:
inotifywait命令 可以用来收集有关文件访问信息,Linux发行版一般没有包括这个命令,需要安装inotify-tools,这个命令还需要将inotify支持编译入Linux内核,好在大多数Linux发行版都在内核中启用了inotify。
inotifywatch命令 用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。
二、安装
apt-get install inotify-tools
三、参数说明
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:指定监控事件项 open 打开文件 access 访问文件 modify 修改文件 delete 删除文件 create 新建文件 attrib 属性变更 --exclude <pattern> 指定要排除监控的文件/目录
例子1:命令监听log.txt文件
$ inotifywait -m log.txt # 这里 -m 参数指明持续监听,不加的话会在一个事件后退出 Setting up watches. Watches established. # 此时持续监听,有事件出发会输出到屏幕
例子2:指定监听事件
inotifywait -m -e create,delete,close_write log.txt
例子3:inotifywait和rsync结合
#!/bin/bash source=/home/kms/Desktop/inotifywait_shell/source/ target=/home/kms/Desktop/inotifywait_shell/target/ log_path=/home/kms/Desktop/inotifywait_shell/inotifywait.log inotifywait -mrq ${source} --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f %e' -e create,modify,attrib,move,delete,close_write | while read files; do echo "$files" >> ${log_path} INO_EVENT=$(echo $files | awk '{print $5}') # 增改查类型 if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] || [[ $INO_EVENT =~ 'ATTRIB' ]] then rsync -avzc ${source} ${target} fi # 删除&移出事件 if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]] then rsync -avz --delete ${source} ${target} fi done
备注:
利用 inotifywait
对文件系统事件实时监控, 触发事件调用 rsync
同步指定目录 (缺点: 每次触发都要扫描整个目录进行文件差异对比, 文件越多越耗时长)
其他参考
https://www.cnblogs.com/clsn/p/8022625.html