通过screen实现近乎并发的shell远程调用 思考和部分实现

   假设一种场景,需要在多个节点需要执行相同命令(考虑命令的不确定性),一般使用for 循环,ssh直接调用。例:需要查看每个节点的根目录使用情况:



   实际上,仅仅需将上述几行命令写成一个脚本,将要执行的命令设为位置参数,即可在一个互信的集群内满足这些要求了,看似问题得到了解决,笔者此前也的确是这么做的,但是问题出现了,有些命令的执行过程漫长,而这种按顺序执行的方法,在执行有些命令时,等待的时间绝对是让人崩溃的,譬如:如果在成百上千个节点集群内,为每个节点更新库(yum update),或者生成yum缓存(yum makecache),或者每个节点都是新的,里面有好多磁盘需要格式化挂载,如果使用for循环按顺序执行,相信我,格式化的磁盘的等待时间会让你无法忍受的,如果这个任务还是在规定的时间必须完成的话.......


好吧,啰嗦半天,需求出现了,先思考要解决的问题,后有简单的部分实现和测试

1、所有节点是互信的,通过安装系统时实现(系统安装阶段实现)

2、所有节点可以使用常规的正则表达式取出对应的IP列表(脚本实现)

3、必须已安装screen包,通过调用这个命令实现近乎并发执行任务(脚本实现)

4、命令执行结果的返回值获取,用以判断是否成功执行(未实现)

5screen的资源释放问题(未实现)

6、考虑网络故障的错误处理(未实现)

7、考虑执行失败的错误处理(未实现)

8、如果需要在每个节点执行的任务过多,可考虑将需要执行的任务写成一个简单的执行脚本,做推送,并控制执行;4567的实现可考虑此方法。

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.\n\n"
done


在三个节点分别放置一个简单的脚本,用来查看命令是否被成功执行,代码如下

#!/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 \n\n" |TEE
    fi
    sleep 1
done


在控制节点执行脚本,结果如下:


在三个节点看到任务启动时间如下:



写文不易,列位看官若觉得还能凑合,给好评哦,亲..



刚弄完这个,忽然想到这个东西放后台应该也是可以的,经测试的确可以,因此,代码可改为

#!/bin/bash
CMD=${1:-/usr/bin/yum makecache}
DATE="/bin/date +%k:%M:%S/%Y-%m-%d"
LOG=/var/log/ctrl.log
SSH="/usr/bin/ssh -q -o StrictHostKeyChecking=no"
LIST=(`cat /etc/hosts|grep mos.com|awk '{print $1}'`)
for i in ${LIST[@]};do
        $SSH $i $CMD &>> $LOG &           
        echo -en "`$DATE` $i done.\n\n"
done

记录所有输出至日志文件,通过日志可判断执行结果对错。这样一来,上述几条中的第4、7都可完成,第5条的问题也不存在,仅剩第6和9两条的需再做思考



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章