前言:linux
什么是Inotify:shell
Inotify是一种强大的,细粒度的,异步的文件系统事件监控机制(软件),linux内核从2.6.13起,加入了Inotify支持,经过Inotify能够监控文件系统中添加,删除,修改,移动等各类事件,利用这个内核接口,第三方软件就能够监控文件系统下文件的各类变化状况centos
inotify的实现:bash
1)inotify-tools,服务器
2)sersync(金山周洋)异步
3)lsyncdide
inotify主要可控配置:工具
在/proc/sys/fs/inotify目录下有三个文件,可适当调整。测试
max_user_watches:设置inotifywait或inotifywatch命令能够监视的文件数量(单进程),默认8192ui
max_user_instances:设置每一个用户能够运行的inotifywait或inotifywatch命令的进程数。默认128
max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。默认16384
以inotify-tools为例实现inotify+rsync实时同步:
安装:
centos 7.4为例,配置epel源
yum install inotify-tools -y
安装后生成一下两个工具
inotifywait:在被监控的文件或目录上等待特定文件系统事件(open,close,delete等)发生,执行后处于阻塞状态,适合shell脚本中使用。
inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计。
inotifywait 参数说明
参数名称 | 参数说明 |
---|---|
-m,–monitor | 始终保持事件监听状态 |
-r,–recursive | 递归查询目录 |
-q,–quiet | 只打印监控事件的信息 |
–excludei | 排除文件或目录时,不区分大小写 |
-t,–timeout | 超时时间 |
–timefmt | 指定时间输出格式 |
–format | 指定输出格式,%T引用--timefmt中指定的时间格式,%Xe指明发生修改的类型,%w发生修改的文件路径,%f发生修改的文件名 |
-e,–event | 后面指定删、增、改等事件 |
-e :--event的各类事件含义
Events | 含义 |
---|---|
access | 文件或目录被读取 |
modify | 文件或目录内容被修改 |
attrib | 文件或目录属性被改变 |
close | 文件或目录封闭,不管读/写模式 |
open | 文件或目录被打开 |
moved_to | 文件或目录被移动至另一个目录 |
move | 文件或目录被移动到另外一个目录或从另外一个目录移动至当前目录 |
create | 文件或目录被建立在当前目录 |
delete | 文件或目录被删除 |
umount | 文件系统被卸载 |
命令行测试示例:
实现inotify+rsync实时同步脚本:
1.
#!/bin/bash Path=/data backup_Server=172.16.1.1 /usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /data | while read line do if [ -f $line ];then rsync -az $line --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password else cd $Path &&\ rsync -az ./ --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password fi done
2.
#!/bin/bash src=/data/ # 须要同步的源路径 des=data # 目标服务器上 rsync --daemon 发布的模块名称 rsync_passwd_file=/etc/rsyncd.passwd # rsync验证的密码文件 ip1=192.168.0.18 # 目标服务器1 ip2=192.168.0.19 # 目标服务器2 user=root # rsync --daemon定义的验证用户名 cd ${src} # 此方法中,因为rsync同步的特性,这里必需要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致 /usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file # 把监控到有发生更改的"文件路径列表"循环 do INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify输出切割 把事件类型部分赋值给INO_EVENT INO_FILE=$(echo $file | awk '{print $2}') # 把inotify输出切割 把文件路径部分赋值给INO_FILE echo "-------------------------------$(date)------------------------------------" echo $file #增长、修改、写入完成、移动进事件 #增、改放在同一个判断,由于他们都确定是针对文件的操做,即便是新建目录,要同步的也只是一个空目录,不会影响速度。 if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # 判断事件类型 then echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO' rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && # INO_FILE变量表明路径哦 -c校验文件内容 rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des} #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 如今能够在不漏文件下也有不错的速度作到平衡) 而后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性 fi #删除、移动出事件 if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]] then echo 'DELETE or MOVED_FROM' rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des} #看rsync命令 若是直接同步已删除的路径${INO_FILE}会报no such or directory错误 因此这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能作到指定文件删除,若是删除的路径越靠近根,则同步的目录月多,同步删除的操做就越花时间。 fi #修改属性事件 指 touch chgrp chmod chown等操做 if [[ $INO_EVENT =~ 'ATTRIB' ]] then echo 'ATTRIB' if [ ! -d "$INO_FILE" ] # 若是修改属性的是目录 则不一样步,由于同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。 then rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des} fi fi done