通过screen实现近乎并发的shell远程调用思考和部分实现
|
副标题[/!--empirenews.page--] 假设一种场景,需要在多个节点需要执行相同命令(考虑命令的不确定性),一般使用for 循环,ssh直接调用。例:需要查看每个节点的根目录使用情况:
实际上,仅仅需将上述几行命令写成一个脚本,将要执行的命令设为位置参数,即可在一个互信的集群内满足这些要求了,看似问题得到了解决,笔者此前也的确是这么做的,但是问题出现了,有些命令的执行过程漫长,而这种按顺序执行的方法,在执行有些命令时,等待的时间绝对是让人崩溃的,譬如:如果在成百上千个节点集群内,为每个节点更新库(yum update),或者生成yum缓存(yum makecache),或者每个节点都是新的,里面有好多磁盘需要格式化挂载,如果使用for循环按顺序执行,相信我,格式化的磁盘的等待时间会让你无法忍受的,如果这个任务还是在规定的时间必须完成的话....... 好吧,啰嗦半天,需求出现了,先思考要解决的问题,后有简单的部分实现和测试 1、所有节点是互信的,通过安装系统时实现(系统安装阶段实现) 2、所有节点可以使用常规的正则表达式取出对应的IP列表(脚本实现) 3、必须已安装screen包,通过调用这个命令实现近乎并发执行任务(脚本实现) 4、命令执行结果的返回值获取,用以判断是否成功执行(未实现) 5、screen的资源释放问题(未实现) 6、考虑网络故障的错误处理(未实现) 7、考虑执行失败的错误处理(未实现) 8、如果需要在每个节点执行的任务过多,可考虑将需要执行的任务写成一个简单的执行脚本,做推送,并控制执行;4、5、6、7的实现可考虑此方法。 9、考虑远程执行命令时环境变量的问题(未实现) 10、不足之处,欢迎补充: 代码部分实现如下: 代码环境如下: 系统为CentOS6.3 x86_64 均已安装screen包和互信 在互信的节点将命令:yum makecache 分别在如下三个节点执行: 10.1.6.1 disk1.mos.com disk1 10.1.6.2 disk2.mos.com disk2 10.1.6.3 disk3.mos.com disk3
#!/bin/bash
CMD=${1:-/usr/bin/yum makecache}
CMD_SN="disk_ver.1"
DATE="/bin/date +%k:%M:%S/%Y-%m-%d"
SSH="/usr/bin/ssh -q -o StrictHostKeyChecking=no"
SCREEN=/usr/bin/screen
LIST=(`cat /etc/hosts|grep mos.com|awk '{print $1}'`)
for i in ${LIST[@]};do
$SSH $i $SCREEN -dmS $CMD_SN
$SSH $i $SCREEN -S $CMD_SN -X screen $CMD
echo -en "`$DATE` $i done.nn"
done
查看本栏目更多精彩内容:http://www.bianceng.cn/OS/Linux/ 在三个节点分别放置一个简单的脚本,用来查看命令是否被成功执行,代码如下:
#!/bin/bash
Date="/bin/date +%k:%M:%S/%Y-%m-%d"
Mlog=/var/log/mon.log
TEE(){
/usr/bin/tee -a $Mlog
}
while :;do
INFO=`ps aux|grep -v grep|grep yum`
if [ -n "$INFO" ];then
echo -en "`$Date` : $INFO nn" |TEE
fi
sleep 1
done
(编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


