使用rsync+inotify实现目录实时同步

一 rsync 安装脚本

#!/bin/bash
#rsync
RY="/usr/bin/rsync"
if [ $(whereis rsync|cut -d' ' -f2) = ${RY} ];then
      touch /etc/rsyncd.conf
else
yum install rsync -y 
touch /etc/rsyncd.conf
fi

# 创建配置文件
\cp $install_dir/conf/rsyncd.conf  /etc/rsyncd.conf

# 安装启动文件
\cp $install_dir/init.d/rsyncd  /etc/init.d/rsyncd
chmod +x /etc/init.d/rsyncd

# 允许873端口访问
iptables -I INPUT -p tcp -m tcp --dport 873 -j ACCEPT

# 启动nginx服务
chkconfig -add rsyncd
/etc/init.d/rsyncd  start

# 检查nginx服务
if [ `ps -ef | grep rsync | grep -v grep | wc -l` = 0 ]; then
    Echo_Red "rsync 安装失败!"
fi

二 安装 inofity 工具

 inotify工具安装配置
安装
1)  从内核和目录里面查看是否支持inotify
[root@nfs01 ~]# uname -r
2.6.32-573.el6.x86_64
[root@nfs01 ~]# ls -l /proc/sys/fs/inotify/    -→主要查看下面有没有三个目录
总用量 0
-rw-r--r-- 1 root root 0 1月  21 13:03 max_queued_events
-rw-r--r-- 1 root root 0 1月  21 13:03 max_user_instances
-rw-r--r-- 1 root root 0 1月  21 13:03 max_user_watches
2)检查是否有安装inotify 如果没有就安装
rpm -qa inotify-tools
没有就先安装epol源
yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
之后安装
或者直接下载安装
http://www.rpmfind.net/linux/epel/6/x86_64/Packages/i/inotify-tools-3.14-2.el6.x86_64.rpm
rpm -ivh .....rpm
[root@nfs01 ~]# yum install inotify-tools -y

三 服务器参数修改

[root@nfs01 ~]# which inotifywait
/usr/bin/inotifywait
添加:
在/etc/sysctl.conf 上添加
fs.file-max = 65535
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
然后重载
#sysctl -p 

四 inotifywait 帮助

[root@nfsserver inotify-tools]# bin/inotifywait —help
r :递归查询目录
q:打印很少的信息,仅仅打印监控事件的信息  安静状态
m:始终保持事件监听状态
excluder#排除文件或者目录的时候不区分大小写
timefmt:指定时间输出的格式
d :后台运行
-e: 事件 里面有很多方法

五 rsync+inotify结合脚本,实时同步

#!/bin/bash
src=/www/wwwroot                 # 需要同步的源路径
des=wwwroot
#rsync_passwd_file=/etc/rsyncd.passwd   # rsync验证的密码文件
ip1=192.168.8.101     # 目标服务器1
user=root          # rsync --daemon定义的验证用户名
cd ${src}          # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致
/usr/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 -avzcogR  $(dirname ${INO_FILE}) ${user}@${ip1}::${des}   # INO_FILE变量代表路径哦  -c校验文件内容
       fi
       #删除、移动出事件
      # if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
      # then
      #         echo 'DELETE or MOVED_FROM'
      #         rsync -avzogR  $(dirname ${INO_FILE}) ${user}@${ip1}::${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 -avzcogR   $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
                fi
       fi
done
发布了77 篇原创文章 · 获赞 0 · 访问量 3232

猜你喜欢

转载自blog.csdn.net/liaowunonghen/article/details/104890074