在不同节点进行数据传输的时候,如果数据文件大小数目比较大的话使用scp经常会传到一半给断掉。
这里我改成了rsync进行断点续传,不过这种方法也会有时候断掉。所以我这里补充了一个使用while循环的操作,即如果断掉了,那就接着来,循环指定次数,直到全部跑完。不过这种方式也有不足之处,有时候全部传完了也会继续跑。但是也无伤大雅,只要全部传完就可以啦~
直接放脚本scp.sh
,如下:
# 设置参数
indir=$1 # 上传文件夹
num=$2 # 循环次数
log_dir=`pwd`
for i in `seq 1 $num`
do
echo $i >> $log_dir/copy.log
expect -c "
set timeout 2000
#spawn scp -r $indir <你的目标账户名>@<你的目标IP>:<你的目标目录>
spawn rsync -arLP $indir <你的目标账户名>@<你的目标IP>:<你的目标目录>
#--- 自动填充密码 ---
expect {
\"password:\" {log_file $log_dir/copy.log;send \"<你的目标账户名密码>\r\";}
timeout { puts \" time out\" ;exit 1 }
}
expect eof"
done
运行很简单,如下
bash <上传文件夹> <次数int>
要注意,上传文件夹不能有/
在最后面,如果有的话会直接上传文件夹里面的内容,而不是整个文件夹!!!
最后会在本地跑的路径下面生成一个copy.log的日志文件,记录了上传的数据日志
![](https://img.haomeiwen.com/i4111755/b55d5d842af35c03.png)
如果不想要这个日志,可以在脚本里面设置rsync -arP
为rsync -arp
。具体的参数解释如下(参考:http://www.ruanyifeng.com/blog/2020/08/rsync.html)
-a、--archive参数表示存档模式,保存所有的元数据,比如修改时间(modification time)、权限、所有者等,并且软链接也会同步过去
-r参数表示递归,即包含子目录。
--progress参数表示显示进展。
--partial参数允许恢复中断的传输。不使用该参数时,rsync会删除传输到一半被打断的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。一般需要与--append或--append-verify配合使用。
-P参数是--progress和--partial这两个参数的结合。
-l 保留软连接
若是拷贝的原目录里面有一个软链接文件,那这个软链接文件指向到了另外一个目录下
在加上-l,它会把软链接文件本身拷贝到目标目录里面去
-L 加上该选项后,同步软链接时会把源文件给同步
如果跑完了会在在文件夹中出现了如下信息:
![](https://img.haomeiwen.com/i4111755/b16fd05619162635.png)
最后,大功告成!如果设置的次数还没有传完,则再继续提交即可,会接着上传。
网友评论