rsync 多进程并发执行同步数据
侧边栏壁纸
  • 累计撰写 170 篇文章
  • 累计收到 176 条评论

rsync 多进程并发执行同步数据

若海
2019-10-29 / 2 评论 / 97,372 阅读 / 正在检测是否收录...

原始命令

rsync -aPv --delete rsync://1.2.3.4/dp1/ /mnt/backup

多进程模式

#!/bin/sh
#

src='rsync://1.2.3.4/dp1' #源路径,结尾不带斜线
dst='/mnt/backup' #目标路径,结尾不带斜线

opt="-aPv --delete" #同步选项

num=16 #并发进程数
depth='5 4 3 2 1' #归递目录深度

task=/tmp/`echo $src$ | md5sum | head -c 16`
[ -f $task-next ] && cp $task-next $task-skip
[ -f $task-skip ] || touch $task-skip

# 创建目标目录结构
rsync $opt --include "*/" --exclude "*" $src/ $dst

# 从深到浅同步目录
for l in $depth ;do
    # 启动rsync进程
    for i in `find $dst -maxdepth $l -mindepth $l -type d`; do
        i=`echo $i | sed "s#$dst/##"`
        if `grep -q "$i$" $task-skip`; then
            echo "skip $i"
            continue
        fi
        while true; do
            now_num=`ps axw | grep rsync | grep $dst | grep -v '\-\-daemon' | wc -l`
            if [ $now_num -lt $num ]; then
                echo "rsync $opt $src/$i/ $dst/$i" >>$task-log
                rsync $opt $src/$i/ $dst/$i &
                echo $i >>$task-next
                sleep 1
                break
            else
                sleep 5
            fi
        done
    done
done

# 最终单进程验证
while true; do
    sleep 5
    now_num=`ps axw | grep rsync | grep $dst | grep -v '\-\-daemon' | wc -l`
    if [ $now_num -lt 1 ]; then
        echo "rsync $opt $src/ $dst" >>$task-log
        rsync $opt $src/ $dst
        break
    fi
done
1

评论 (2)

取消
  1. 头像
    武鹏飞
    Windows 10 · Google Chrome
    创建目标目录结构

    rsync $opt --include "*/" --exclude "*" $src/ $dst

    先创建目录,然后find $dst

    请问这块用src,不同步目录有问题吗?
    我用脚本跑上千万个目录同步耗时很长

    回复
    1. 头像
      若海 作者
      Windows 10 · Google Chrome
      @ 武鹏飞

      这里的确会非常的耗时

      回复