免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2555 | 回复: 0
打印 上一主题 下一主题

也发表一个并行批量运行 Shell 的脚本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-06 11:25 |只看该作者 |倒序浏览
本帖最后由 relvigour 于 2012-03-06 11:45 编辑

这个是我自己用的批量在多个主机上运行 Shell 的脚本 ,看有人求这个,就把这个帖出来一下,希望对大家有所帮助。 因为是自用,用着方便就好, 所以有些细节没有调整,就将就着用吧。

主要方便的是,所有的脚本式并行在所有的机器上跑的。 如果主机多的话,出结果会比较快点。缺点就是,各个机器回来的结果可能是交叉在一起的。

使用方法
  1。在当前目录建立一个 all_linux.list 文件记录所有的linux 主机
     每一行的格式为  "IP        tag1  tag2 ... " ,
  2。把其中所有的 IP 的 ssh 密钥登陆都搞好。
  3。可以使用了。
            方法一:  allsh.sh " ls | wc "
                     从all_linux.list读取ip 信息,逐个运行 " ls | wc " 程序命令
            方法二:  grep  tag1 all_linux.list | allsh.sh " w "
                     只针对含有 tag1 的行运行  "ls | wc" 命令
  
  4。 结果会输出成这个样子  
192.168.1.1 :   11:12:17 up 02:41,  2 users,  load average: 0.00, 0.00, 0.00
192.168.1.1 :   USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
192.168.1.1 :   root     pts/0    192.168.1.100     08:58    0.00s  0.02s  0.00s w
192.168.1.1 :   root     pts/1    192.168.1.100     08:59   15:09   0.04s  0.04s -bash
192.168.1.2 :   11:12:17 up 02:41,  2 users,  load average: 0.00, 0.00, 0.00
192.168.1.2 :   USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
192.168.1.2 :   root     pts/0    192.168.1.100     08:58    0.00s  0.02s  0.00s w
192.168.1.2 :   root     pts/1    192.168.1.100     08:59   15:09   0.04s  0.04s -bash  


脚本如下:
###############################
#!/bin/sh
if [  $# -lt 1  ];then
     echo "Please input a command "
     exit
fi

DANGER=`echo $remotecmd | grep -E "(reboot|shutdown|init|poweroff)" | wc -l `
if [ $DANGER -gt 0 ]; then
        echo "There is a danger command. Please run it one by one "
        exit
fi

breakpsh()
{
   #echo "Break Current Process List!!!!"
   for ii in  $PIDLIST ; do {
        kill -15 $ii 2> /dev/null
   } done
   kill -15 `ps -T|grep ssh|gawk '{print $1}'`
   echo "Some process may not close normally!!!" >&2
   exit
}

waitclose()
{
        # echo "Waitting for all process close"
        for ii in  $PIDLIST ; do wait $ii ; done
}

if [ -p /dev/stdin ] ; then
{
    ALL_Linux_IPs=
    while read -e pline ; do  {
       if  echo $pline | grep -E '^([0-9]{1,3}\.){3}[0-9]{1,3}' -q ; then
       {
           ip=$(echo $pline | gawk '{print $1}' )
           ALL_Linux_IPs="$ALL_Linux_IPs $ip"
       } fi
    } done
} else {
    [ "x$HOSTIPFILE"  == "x" ] &&  [ -f ./all_linux.list ]  && HOSTIPFILE=./all_linux.list
    [ "x$HOSTIPFILE"  == "x" ] && echo " No host ip list " && exit
    ALL_Linux_IPs=$(gawk '{ print $1}' $HOSTIPFILE  | egrep '^([0-9]{1,3}\.){3}[0-9]{1,3}')
} fi

trap 'breakpsh'  2 3 15
trap 'waitclose' exit


PIDLIST=
for ip in $ALL_Linux_IPs ; do
{
   ssh  $ip  $remotecmd 2>&1  | gawk -v IP=$ip '{print IP"\t: " $0}'  &
   PIDLIST="$PIDLIST $!"
}
done
###############################

评分

参与人数 2可用积分 +11 收起 理由
zooyo + 5 谢谢分享
waker + 6 感谢分享

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP