假设一种场景,需要在多个节点需要执行相同命令(考虑命令的不确定性),一般使用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.\n\n" done
查看本栏目更多精彩内容:http://www.bianceng.cnhttp://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 \n\n" |TEE fi sleep 1 done
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索问题
, 脚本
, 命令
, 节点
, 多节点并发
, screen
, 近乎
, Bin
, screen命令
tee命令
adb shell screencap、shell screen、shell脚本操作screen、screen脚本 shell交互、shell脚本screen,以便于您获取更多的相关知识。