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

假设一种场景,需要在多个节点需要执行相同命令(考虑命令的不确定性),一般使用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,以便于您获取更多的相关知识。

时间: 2024-10-21 20:57:57

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

ubuntu chrome secure shell远程登录出错?

问题描述 ubuntu chrome secure shell远程登录出错? Welcome to Secure Shell version 0.8.34.Answers to Frequently Asked Questions: http://goo.gl/TK7876 [Pro Tip] Use 'Open as Window' to keep Control-W from closing your terminal![Pro Tip] See http://goo.gl/TK7876 f

Linux Shell远程执行命令(命令行与脚本方式)

shell远程执行: 经常需要远程到其他节点上执行一些shell命令,如果分别ssh到每台主机上再去执行很麻烦,因此能有个集中管理的方式就好了.一下介绍两种shell命令远程执行的方法. 前提条件: 配置ssh免密码登陆 对于简单的命令: 如果是简单执行几个命令,则: ssh user@remoteNode "cd /home ; ls" 基本能完成常用的对于远程节点的管理了,几个注意的点: 双引号,必须有.如果不加双引号,第二个ls命令在本地执行 分号,两个命令之间用分号隔开 对于脚

java如何远程调用linux的命令或者脚本

Java通过SSH2协议执行远程Shell脚本(ganymed-ssh2-build210.jar) 使用步骤如下: 1.导包 官网下载: http://www.ganymed.ethz.ch/ssh2/ maven坐标: <dependency> <groupId>com.ganymed.ssh2</groupId> <artifactId>ganymed-ssh2-build</artifactId> <version>210&l

架构师之路-在Dubbo中开发REST风格的远程调用

概述 dubbo支持多种远程调用方式,例如dubbo RPC(二进制序列化 + tcp协议).http invoker(二进制序列化 + http协议,至少在开源版本没发现对文本序列化的支持).hessian(二进制序列化 + http协议).WebServices (文本序列化 + http协议)等等,但缺乏对当今特别流行的REST风格远程调用(文本序列化 + http协议)的支持. 有鉴于此,我们基于标准的Java REST API--JAX-RS 2.0(Java API for REST

Openstack Nova 源码分析 — RPC 远程调用过程

目录 目录 Nova Project Services Project 的程序入口 setuppy Nova中RPC远程过程调用 nova-compute RPC API的实现 novacomputemanager 模块 最后 Nova Project Services nova-api:捕获novaclient发送过来的HTTP请求,并且将它转换为AMQP消息,通过Queue来与别的services通信. nova-conductor:为数据库访问提供了一层安全保障. NOTE:除了nova-

【PHP】远程调用以及RPC框架

前言 一个项目,从开始到版本更新,一直到最后的版本维护.功能在不断增多,对应的代码量也在不断增加,也就意味着项目变得更不可维护,这时候,我们需要用拆分的方式将一个项目打散,以便开发团队更好的对项目进行维护. 分模块 这个阶段,一般也是项目的初级阶段,由于人手不够,一个服务端的接口项目只有一个开发进行维护,根据开发的习惯,会把项目分成若干个模块进行开发,在一个项目下进行部署. 这样做的缺点在于项目会随着版本更新而变得不可维护. 分项目 随着每个模块功能的不断完善,代码变得更加臃肿.这时候需要对项目

Python实现远程调用MetaSploit的方法_python

本文较为详细的讲述了Python实现远程调用MetaSploit的方法,对Python的学习来说有很好的参考价值.具体实现方法如下: (1)安装Python的msgpack类库,MSF官方文档中的数据序列化标准就是参照msgpack. root@kali:~# apt-get install python-setuptools root@kali:~# easy_install msgpack-python   (2)创建createdb_sql.txt: create database msf

架构设计:一种远程调用服务的设计构思(zookeeper的一种应用实践)

在深入学习zookeeper我想先给大家介绍一个和zookeeper相关的应用实例,我把这个实例命名为远程调用服务.通过对这种应用实例的描述,我们会对zookeeper应用场景会有深入的了解. 远程调用是系统与系统之间的通信机制,它的另一种理解就是进程间的通信.做分布式系统的开发,远程调用技术是其核心技术.远程调用技术可以将一组计算机系统形成一个网络系统,对外提供整体服务,那么这一群的计算机系统就构成了一个更大型,性能更高的计算机系统. 我在前面的博客里介绍了一种分布式网站的架构设计,其中就有一

jax_ws 客户端远程调用方法时必须使用wsimport命令生成接口代码

问题描述 jax_ws 客户端远程调用方法时必须使用wsimport命令生成接口代码 jax_ws 客户端远程调用方法时,不生成服务端的代码如何实现?