Rsync+inotify详解

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

  

上一篇:SpringBoot实现上传下载(一)


下一篇:rsync远程同步