关于bash如何进行并发执行!

  通常我们用脚本对一批机器做操作的时候,我们会用如下的代码片段:

                for i in `cat ip.txt`; do

        # To do something...

        echo $?

                done

        但是这样的模版有个问题,在机器数量比较少的时候,还能取得比较满意的效果。但是如果试想一下!当ip.txt中的主机数量上百,而To do something又是一个比较耗时的操作的时候,这样的脚本运行一次可能需要的时间就不是一小会了。虽然我们可以盯着屏幕,看着自己写的脚本平稳地运行,心情也会很好。但是这样长时间的等待毕竟是一件不能令人愉快的事情。这个时候我们就在想,能不能对脚本做并发呢?让系统对每一个To do something都同时运行呢。这样在一定范围数量内的运行时间就非常令人可观了(为什么是一定范围数量呢?后面会解释)!其实我们可以用这样的代码片段来代替上面的:

                for i in `cat ip.txt`; do

        {

            # To do something

            echo $?

        } &

                done

        如此一来,脚本的运行就会针对每一次循环开启一个子shell进行运算了。时间上也会节省很多。下面是一个ping的例子。

        假如我有10台主机,ip地址都写在ip.txt中,然后我要对这些主机每一台进行:ping -c 5 <ip_address>,那么我可以这么写。

                for i in `cat ip.txt`; do

        {

            ping -c 5 $i

            echo $?

        } &

                done

        如果我还用原来的方式进行ping的话,可能需要用到将近50秒左右的时间,但是如果放在并发里面的话时间就会缩短到5秒左右。这样看来是比较理想的情况了,但是我们在继续想一下(呵呵,运维的工作的复杂度是和机器数量成正比的^_^!),如果此时有500台机器要ping怎么办?我们还用上面的并发代码片段就会有问题了。我猜想运行的时候系统可能会变的很慢,因为系统要开500个子shell来完成这些工作。所以下面我们需要控制同时并发的数量,不能让系统同时运行太多的子shell。网上看到有一些用管道做的,但是感觉太复杂(呵呵,主要是自己没看懂),其实我们可以这样考虑,不妨把上面的并发代码段看成是一个类似进程池的东西,我们把:for i in `cat ip.txt`部分改造成为一个固定次数的循环,然后增加一个数组,每次往这个数组中放置好ip,然后用循环处理,看起来应该是这个样子:

                a=(ip1 ip2 ip3 ip4 ip5)

                for ((i=0; i<5; i++)); do

        {

            ping -c 5 ${a[i]}

            echo $?

        } &

                done

        然后每次读取ip.txt中的5个ip后再调用这个代码片段。这样每次就控制在5个进程了,应该不会导致系统卡住或者很慢。



本文转自 wangergui 51CTO博客,原文链接:http://blog.51cto.com/wangergui/1926853,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值