在前段时间工作中,我们在编写linux搬运脚本程序时遇到了瓶颈;脚本内容如下图
脚本设计方案:我通过linux的scp远程传输命令,将192.168.121.36机子中的文件传输到本机指定(/home/0912data/)路径下,然后用ssh远程操作192.168.121.36将其指定(/home/0912data/)路径下的文件删除;贴代码~
#!/bin/bash
while true
do
set time 30
ssh root@192.168.121.36 ls /home/0912data/ > ./zuxun36.files
while read file
do
echo "-----------------------"
/usr/bin/scp -r root@192.168.121.36:/home/0912data/* /home/0912data/
echo "scp [$file] to [10.98.33.87] successful!!"
/usr/bin/ssh root@192.168.121.36 rm -r /home/0912data/*
echo "mv [$file] to /home/eversec-contentmonitor/0912data_bak/ successful!!"
#func_scp_to_dev $remote_host $file
#func_scp_to_mv $remote_host $file
done < zuxun36.files
rm zuxun36.files
#sleep 5
done
问题:
- 搬运慢
- 有时候删除不掉
原因:原本使用的搬运(scp -r)程序原理是一个一个文件搬,效率低,并且删除用rm -rf命令 在文件数量大于一定上限时(实际项目操作中2000个txt文件就会删除失败,抛出list too much)会删除失败;SO,我们使用了半年的搬运程序是存在很大问题的,赶紧处理--->
升级后的程序:
引入了linux中的rsync同步命令,无论在搬运还是删除方面,都是相对最优的,一开始优化时我们使用了强制删除find . -name "*" -exec rm {} \; -print 方式;但是强制删除存在许多不安全因素,后来我们发现了一种效率更高的方法,原理类似于 echo “” xxx.txt ;没错,就是重定向!
如下图,删除公式的含义为:ssh远程10.92.8.98服务器,将/home/0912data/文件夹下的文件同步到/home/0912clear/文件夹下,然后重定向清空/home/0912clear/文件夹下的同步内容
rsync -a --delete /home/0912clear/ /home/0912data/
后来就有了图中简洁明了的.sh脚本(注意明确文件夹名后面的“/”),错误日志记录都不需要咯。
贴代码~
#!/bin/bash
/usr/bin/rsync root@192.168.2.164:/home/0912data/* /home/0912data/
/usr/bin/ssh root@192.168.101.40 rsync -a --delete /home/0912clear/ /home/0912data/
下一篇主要讲述我工作经(zao)历(yu)中遇到的服务器间免密功能搭建问题,以及对某些做传输限制的服务器,用expect做模拟用户输入密码的方式去完成搬运任务