zoukankan      html  css  js  c++  java
  • rsync续传大目录一例

    场景

    要将大约60T的文件从一台服务器上搬到另外一台上。两边分区还不一样大,一边是一个整的60T大分区,另一边是15T一个的小分区。

    解决思路

    类比茶壶倒水,一个分区一个分区的填,填满一个再填第二个。

    步骤

    先将要同步的目录名全路径按时间排序写到一个文件里。每次从文件里取一行来做同步,成功则写入日志1中,失败则写入日志2中并记下时间戳。

    每次同步前先检查日志1,如果存在则跳过。

    代码实现

    #!/bin/bash
    
    prefix=/root/rsync/xvdf1/sync_1_300
    mkdir -p $prefix
    
    input_file=$prefix/fdlist.txt
    
    success_log=$prefix/sync_status1.log
    failure_log=$prefix/sync_status2.log
    process_log=$prefix/sync_status3.log
    details_log=$prefix/sync_status4.log
    
    du_log=$prefix/tmp_du.log
    
    touch $success_log $failure_log $process_log $du_log $details_log
    
    DEST=/xyz/xvdf1/192.168.10.112/ifs/home/xyftp/xyftpdir06/
    
    count=1
    toltal=`wc -l $input_file|awk '{print $1}'`
    while read src_fd
    do
    
        while read line_st
        do
            if [[ $line_st == $src_fd ]]
            then
                rate=`echo "scale=4;($count/$toltal)*100"|bc`
                echo -e "[$count/$toltal]	$rate	$src_fd	Skip"
                count=`echo $count+1|bc`
                continue 2
            fi
        done <$success_log
    
        rate=`echo "scale=4;($count/$toltal)*100"|bc`
        echo -e "[$count/$toltal]	$rate%	$src_fd" >$process_log
        du_str=`du -sh $src_fd`
    
        echo -e "$count	$du_str ... ..."
        rsync -avz --delete $src_fd root@192.168.240.69:$DEST > $details_log
    
        ret=$?
    
        if [[ $ret -eq 0 ]]
        then
            echo -e "[$count/$toltal]	$rate	$src_fd	Success"
            echo -e "$count	$du_str">>$du_log
            echo "$src_fd">>$success_log
            count=`echo $count+1|bc`
        else
            time_stap=`date "+%Y-%M-%d %H:%m:%S"`
            echo -e "[$count/$toltal]	$rate	$src_fd	Failure"
            echo -e "[$count/$toltal]	$rate	$src_fd	Failure	$time_stap" >>$failure_log
            du_str=""
            count=`echo $count+1|bc`
            break
        fi
    done <$input_file
    
    echo "Summary:"
    echo "====================================="
    echo "Success list:"
    echo "-------------------------------------"
    cat $success_log
    echo "Failure list:"
    echo "-------------------------------------"
    cat $failure_log
    echo "Last one:"
    echo "-------------------------------------"
    cat $process_log  

    备注

    • 因为目录太大,可以拆片执行。比如 cat ../folder_list.txt | sed -n '1,300p' > fdlist.txt 每300行作为一个输入文件,这样可以并行执行。
    • rsync走ssh-ftp传输时要输入密码的,可以提前做ssh-public-key配好就不会被阻断了。
    • 因bash兼容性问题,调试前将rsync改为 -dry-run 模式,可能不同的linux发行版执行时会出错。
  • 相关阅读:
    02树莓派刷入系统
    Debian stretch更换国内源
    C#-WebForm-点击网页中的按钮后跳转到其他页面是怎么实现的?
    C#-WebForm-WebForm开发基础、如何给控件注册事件?——事件委托写法、http无状态性、三层结构
    C#-WebForm-表单元素
    C#-WebForm-ASP开发练习:从数据库中动态添加信息
    C#-WebForm-WebForm开发基础
    C#-WinForm-TextBox中只能输入数字的几种常用方法(C#)
    C#-和时间有关的计算代码、时间相减 得到天数、小时、分钟、秒差
    C#-WinForm-用户控件如何获取父级窗体
  • 原文地址:https://www.cnblogs.com/hyang0/p/6795606.html
Copyright © 2011-2022 走看看