rsync+inotify实现数据实时同步 最后优化的脚本以下 #!/bin/bash src="/data/www/" # 须要同步的源路径 des=data # 目标服务器上 rsync --daemon 发布的名称,rsync rsync_passwd_file=/etc/rsyncd.passwd # rsync验证的密码文件 ip1=192.168.239.133 # 目标服务器1 user=rsync_backup # 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 * INOEVENT=$(echo $file | awk '{print $1}') # 把inotify输出切割 把事件类型部分赋值给INOEVENT INOFILE=$(echo $file | awk '{print $2}') # 把inotify输出切割 把文件路径部分赋值给INOFILE echo "-------------------------------$(date)------------------------------------" echo $file #增长、修改、写入完成、移动进事件 #增、改放在同一个判断,由于他们都确定是针对文件的操做,即便是新建目录,要同步的也只是一个空目录,不会影响速度。 if [[ $INOEVENT =~ 'CREATE' ]] || [[ $INOEVENT =~ 'MODIFY' ]] || [[ $INOEVENT =~ 'CLOSEWRITE' ]] || [[ $INOEVENT =~ 'MOVEDTO' ]] # 判断事件类型 then echo 'CREATE or MODIFY or CLOSEWRITE or MOVEDTO' rsync -avzcR --password-file=${rsyncpasswdfile} $(dirname ${INOFILE}) ${user}@${ip1}::${des} #仔细看 上面的rsync同步命令 源是用了$(dirname ${INOFILE})变量 #即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端 #环境下会漏文件 如今能够在不漏文件下也有不错的速度 作到平衡) #而后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性 fi #删除、移动出事件 if [[ $INOEVENT =~ 'DELETE' ]] || [[ $INOEVENT =~ 'MOVEDFROM' ]] then echo 'DELETE or MOVEDFROM' rsync -avzR --delete --password-file=${rsyncpasswdfile} $(dirname ${INOFILE}) ${user}@${ip1}::${des} #看rsync命令 若是直接同步已删除的路径${INOFILE}会报no such or directory错误 #因此这里同步的源是被删文件或目录的上一级路径 #并加上--delete来删除目标上有而源中没有的文件,这里不能作到指定文件删除, #若是删除的路径越靠近根,则同步的目#录月多,同步删除的操做就越花时间。 #这里有更好方法的同窗,欢迎交流。 fi #修改属性事件 指 touch chgrp chmod chown等操做 if [[ $INOEVENT =~ 'ATTRIB' ]] then echo 'ATTRIB' if [ ! -d "$INOFILE" ] # 若是修改属性的是目录 #则不一样步,由于同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录 then* rsync -avzcR --password-file=${rsyncpasswdfile} $(dirname ${INOFILE}) ${user}@${ip1}::${des} fi fi done*