• 欢迎访问蜷缩的蜗牛博客 蜷缩的蜗牛
  • 微信搜索: 蜷缩的蜗牛 | 联系站长 kbsonlong@qq.com
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

inotify + rsync实时同步文件方案

Linux 蜷缩的蜗牛 7个月前 (02-08) 13次浏览 已收录 0个评论

#!/bin/bash
#Script Name : inotify_rsync.sh
#
##加载配置文件
source config.ini
#########################
#config.ini              ##
#dest=/data/ftp          ##需要同步的目录
#server=192.168.137.153  ##rsync 服务器
#mode=ftp                ##同步到 rsync 服务器的模块 rsync mode
#logfile=inotify_rsync   ##同步日志名称
#########################


basepath=$(cd `dirname $0`; pwd)
name=$(basename $0)
INO_CMD=`which inotifywait`

if [ ! -d "${dest}" ];then
    echo ${dest} is not exist
    exit 1
fi

${INO_CMD}  -mrq --format '%Xe %w%f' -e create,delete,moved_to,moved_from,close_write ${dest} | tee ${basepath}/inotify_events.`date +%Y%m%d`.log | while read file 
do

    INO_EVENT=$(echo $file | awk '{print $1}')      # 把 inotify 输出切割 把事件类型部分赋值给 INO_EVENT
    INO_FILE=$(echo $file | awk '{print $2}' |sed "s#${dest}/# #g")       # 把 inotify 输出切割 把文件路径部分赋值给 INO_FILE
    
        echo "$INO_FILE" | grep -Ev "\...*sw[a-z]x?$|\.*\.[a-zA-Z0-9]{6}" > /dev/null #grep -Ev 用于排除正在编辑的.swx/.swp/.swpx 等临时文件
        if [ $? -eq 0 ];then 
        #增加、修改、写入完成、移动进事件
        if [[ $INO_EVENT =~ 'CREATE' ]]  ||  [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         # 判断事件类型
        then
                  cd ${dest}
                  echo "-------------------------------$(date)------------------------------------"  >> ${basepath}/${logfile}`date +%Y%m%d`.log
                  echo "$INO_EVENT $INO_FILE" >> ${basepath}/${logfile}`date +%Y%m%d`.log
                rsync -avzcR ${INO_FILE} --exclude="${name}"  ${server}::${mode}  1>> ${basepath}/${logfile}`date +%Y%m%d`.log 2>> ${basepath}/${logfile}`date +%Y%m%d`.err
                ##将本地发生变化的文件推送到目标服务器

        fi
        #删除、移动出事件
        if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
        then
                cd ${dest}
                echo "-------------------------------$(date)------------------------------------"  >> ${basepath}/${logfile}`date +%Y%m%d`.log
                echo " $INO_EVENT $INO_FILE" >> ${basepath}/${logfile}`date +%Y%m%d`.log
                rsync -avzcR --delete  $(dirname ${INO_FILE}) --exclude="${name}"  ${server}::${mode} 1>> ${basepath}/${logfile}`date +%Y%m%d`.log 2>> ${basepath}/${logfile}`date +%Y%m%d`.err
                #看 rsync 命令 如果直接同步已删除的路径${INO_FILE}会报 no such or directory 错误 所以这里同步的源是被删文件或目录的上一级路径,并加上--delete 来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。
        fi
    fi
done

蜷缩的蜗牛 , 版权所有丨如未注明 , 均为原创丨 转载请注明inotify + rsync 实时同步文件方案
喜欢 (0)
[]
分享 (0)

您必须 登录 才能发表评论!