rsync断点续传

Published: 06 Nov 2014 Category:

项目需要从线上服务器拉大量的数据到办公网络的测试机中,由于传输过程中VPN经常断,导致数据传输失败。为了解决这个问题,写了一个脚本用来重连VPN,并重启传输任务:

 1: #!/bin/ bash
 2: 
 3: cp /etc/resolv.conf.bak /etc/resolv.conf
 4: /usr/sbin/vpnc-disconnect
 5: sleep 5
 6: /usr/sbin/vpnc
 7: binary="rsync"
 8: cnt=$(ps aux | grep "\<$binary\>" | grep -v "grep" | grep -v "\<vi\>" | wc -l)
 9:     if [ $cnt -eq 0 ]; then
10:       echo "Server not started yet"
11:     fi
12:     pid=$(ps aux | grep "\<$binary\>" | grep -v "grep" | grep -v "\<vi\>" | awk '{print $2}')
13:     echo $pid
14:     if [ "X$pid" = "X" ]; then
15:       echo "No server instance found"
16:     fi
17:     kill -9 $pid
18: nohup rsync -av -e 'ssh -i /home/user/prikey' search@10.10.65.160:/var/data /var > /home/user/data.log 2>&1 &

脚本会中断VPN并重连,杀掉已有的rsync进程,然后重启rsync任务。在crontab中添加这个脚本,每两个小时执行一次:

#crontab task
50 */2 * * * /bin/bash /home/user/restart_service.sh > /home/user/restart.log 2>&1

不过实际执行中发现,数据传输始终不能完成。原来在间隔的两小时内,有些大文件传不完,rsync进程重启再次从头开始传输中断 的文件,传完之前又被杀掉,如此循环往复。经过查询,rsync支持断点续传,在原来命令上加入 -P 参数就可以了。把上面脚本中rsync命令改成:

nohow rsync -avP -e 'ssh -i /home/manan/prikey' ...

再次开始任务,数据传输很快完成。

更多关于rsync续传的内容,可以参考我的wiki:http://wiki.manan.org/os/linux/rsync.html