版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/q2365921/article/details/54192366
今天需要备份Solr中的一张大表的Shard(估计几百G)到一块硬盘里,一共11个节点,如果挨个备份那就需要一定时间了,第一时间想到的办法是,用nohup后台Scp过去
下面是命令
nohup scp -r /solr/tableName* root@192.168.*.*:/mnt/usb1 > /dev/null &
1
可是在节点上执行出现了问题,看日志应该是*号匹配到的文件每个都需要输入一次密码.
唉这下估计是不行了,但想了想如果不加nohup这样敲又可以
scp -r /solr/shard* root@192.168.1.1:/mnt/usb
1
不过这样我就只能开着shell一直等到他全部备份了,那样需要很长时间,而且我是连着VPN操作的
不过我记得还有一个命令可以解决这种场景
下面就是我的解决方案:将下面的命令保存为expect.sh脚本,并且安装expect环境,执行nohup sh expect.sh >/de v/null & 。
注意:不要忘记添加 spawn bash -c 该命令解决Spawn 中通配符识别问题,如不添加则expect 将会把solr/tab* 识别为字符串,而不是多个路径 因为expect相当于一个独立环境,不回将*号识别为通配符
方案一
#!/bin/bash
#添加shell环境
/usr/bin/expect -c "
#设置超时时间-1为永不超时
set timeout -1
spawn bash -c \"scp -r /solr/shard* root@192.168.1.1:/mnt/usb \"
expect \"password:\"
send \"123456\r\"
# 如果遇到了文件结束符(EOF),该程序就会停下来,然后expect返回
expect eof
1
2
3
4
5
6
7
8
9
10
方案二(方案一在一开始调试的时候有问题,后来在研究明白expect eof 后才完善方案一)
#!/bin/bash
#在bin/bash情况加添加循环逐个进行scp
for file in `ls /solr/ | grep shard`
do
/usr/bin/expect -c "
set timeout -1
spawn bash -c \"scp -r /solr/$file root@192.168.1.1:/mnt/usb\"
expect {
#exp_continue 继续执行后面的匹配
\"(yes/no)?\" {send \"yes\r\";exp_continue}
\"password:\" {send \"123456\r\"}
}
expect eof
"
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
该解决方案思路是采用Except命令来解决交互性的,详细使用参考下文
http://www.cnblogs.com/lzrabbit/p/4298794.html
http://www.myexception.cn/linux-unix/1772272.html
————————————————
版权声明:本文为CSDN博主「南烛」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/q2365921/article/details/54192366