rsync断点续传
项目需要从线上服务器拉大量的数据到办公网络的测试机中,由于传输过程中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。