自动化运维、大数据、Docker

inotify + rsync实时同步文件方案

#!/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
赞(0) 打赏
蜷缩的蜗牛 , 版权所有丨如未注明 , 均为原创丨 转载请注明蜷缩的蜗牛 » inotify + rsync实时同步文件方案
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏