Rsync+inotify详解 inotify是什么 Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加、删除,修改、 移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化,而inotify-tools正是实现这种监控的软件 特别说明:inotify配置是建立在rsync服务基础上的配置过程。 1、查看当前系统是否支持inotify [root@ansb01 tmp]# uname -r 3.10.0-1160.25.1.el7.x86_64 [root@ansb01 tmp]# ls -l /proc/sys/fs/inotify/ 总用量 0 -rw-r--r-- 1 root root 0 10月 5 16:00 max_queued_events -rw-r--r-- 1 root root 0 10月 5 16:00 max_user_instances -rw-r--r-- 1 root root 0 10月 5 16:00 max_user_watches # 显示这三个文件则证明支持 # max_queued_events 表示调用inotify时分配到inotify instance中可排队的event数的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件 # max_user_instances 表示每一个real user ID可以创建的inotify instatnces数量的上限 # max_user_watches 表示每个inotify实例相关联的watches的上限,也就是每个inotify实例可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况适当增加此值的大小 例如: echo 30000000 > /proc/sys/fs/inotify/max_user_watches 2.安装inotify [root@ansb01 tmp]# yum -y install inotify-tools inotify-tools安装后会得到inotifywait和inotifywatch这两条命令 inotifywait命令可以用来收集有关文件访问信息,Linux发行版一般没有包括这个命令,需要安装inotify-tools,这个命令还需要将inotify支持编译入Linux内核,好在大多数Linux发行版都在内核中启用了inotify。 inotifywatch命令用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。 3.inotifywait命令参数 -m 是要持续监视变化。 -r 使用递归形式监视目录。 -q 减少冗余信息,只打印出需要的信息。 -e 指定要监视的事件列表。 --timefmt 是指定时间的输出格式。 --format 指定文件变化的详细信息。 –timefmt 说明: Ymd分别表示年月日,H表示小时,M表示分钟 –format 说明: 参数 说明 %w 表示发生事件的目录 %f 表示发生事件的文件 %e 表示发生的事件 %Xe 事件以“X”分隔 %T 使用由–timefmt定义的时间格式 可监控的事件: 参数 说明 access 访问,读取文件。 modify 修改,文件内容被修改 attrib 属性,文件元数据被修改。 move 移动,对文件进行移动操作。 create 创建,生成新文件 open 打开,对文件进行打开操作 close 关闭,对文件进行关闭操作。 delete 删除,文件被删除。 更详细的介绍请参看man inotifywait 案例1:例如监控客户端/tmp目录,当/tmp目录有文件新增时,会显示新增文件 [root@ansb01 tmp]# inotifywait -mqr --timefmt '%Y%m%d %H:%M' --format '%T %w%f' -e create /tmp/ 20211005 16:43 /tmp/9.txt 20211005 16:45 /tmp/11.txt 案例2:监控create delete事件,当删除9.txt 11.txt时 [root@ansb01 tmp]# inotifywait -mqr --timefmt '%Y%m%d %H:%M' --format '%T %w%f' -e create,delete /tmp/ 20211005 16:46 /tmp/9.txt 20211005 16:46 /tmp/11.txt 案例3:简化事件输出,去掉时间格式输出 [root@ansb01 tmp]# inotifywait -mqr --format '%w%f' -e create,delete /tmp/ /tmp/8.txt #!/bin/bash # rsync-inotify.sh src=/tmp inotifywait -mrq --format '%w%f' -e create,delete,close_write $src \ |while read file do cd $src && rsync -zva ./ --delete rsync_backup@192.168.138.20::backup --password-file=/etc/rsync.password done