shell模拟并发执行

参考:
http://www.51testing.com/html/28/116228-238978.html
http://blog.chinaunix.net/uid-27571599-id-3473078.html 
  
    在bash中,使用后台任务来实现任务的多进程化。在不加控制的模式下,不管有多少任务,全部都后台执行。也就是说,在这种情况下,有多少任务就有多少“进程”在同时执行。
 
实例一:正常脚本(脚本功能:查看一个文件中的IP列表循环测试主机连通性)
[[email protected] ~]# cat ip.txt 
192.168.0.24
192.168.0.25
192.168.0.26
192.168.0.27
192.168.0.28
192.168.0.29
192.168.0.40
192.168.0.41
192.168.0.42
192.168.0.43
192.168.0.81
[[email protected] ~]# cat ping_host.sh
#!/bin/bash
 
array=$(cat ip.txt)
#echo $array
 
for host in ${array[@]}
do
        {
               ping $host -c 10 -w 1 -i 0.01 -q >/dev/null 2>&1
               ret=$?
               if [ $ret -eq 0 ];then
                        echo "$host isok"
               else
                        echo "$host isbad"
               fi
        }
done
[[email protected] ~]# time sh ping_host.sh
192.168.0.24 is bad
192.168.0.25 is bad
……………………..
117.79.235.238 is ok
210.14.130.130 is ok
210.14.156.210 is ok
 
real    0m30.688s
user   0m0.099s
sys    0m0.501s
 
实例二:”多进程”实现(无法精确控制并发数量)
[[email protected] ~]# cat ping_host.sh
#!/bin/bash
 
array=$(cat ip.txt)
#echo $array
 
for host in ${array[@]}
do
        {
                ping $host -c 10 -w 1 -i0.01 -q >/dev/null 2>&1
                ret=$?
                if [ $ret -eq 0];then
                        echo"$host is ok"
                else
                        echo"$host is bad"
                fi
        }&
done
[[email protected] ~]# time sh ping_host.sh
 
real   0m0.092s
user   0m0.006s
sys    0m0.014s
 
注:就在上面基础上多加了一个后台执行&符号,此时应该是所有循环任务并发执行
问题:进程数目不可控制的情况
 
实例三:多线程实现
本实例说明了一种用wait、read命令模拟多线程的一种技巧,此技巧往往用于多主机检查,比如ssh登录、ping等等这种单进程比较慢而不耗费cpu的情况,还说明了多线程的控制。
[[email protected] ~]# cat ping_host.sh
#!/bin/bash
 
tmp_fifofile="/tmp/$.fifo"
mkfifo $tmp_fifofile                 
exec 6<>$tmp_fifofile                
rm $tmp_fifofile
 
thread=5                          
for ((i=0;i<$thread;i++));do
echo
done >&6                         
 
array=$(cat ip.txt)
#echo $array
 
for host in ${array[@]}
do                               
read -u6                           
{                                                   
    ping$host -c 10 -w 1 -i 0.01 -q >/dev/null 2>&1
    ret=$?
    if [$ret -eq 0 ];then
           echo "$host is ok"
    else
           echo "$host is bad"
    fi
       echo >&6                                    
} &
done
 
wait                                                 
exec 6>&-                                           
exit 0
[[email protected] ~]# time sh ping_host.sh
192.168.0.27 is bad
192.168.0.26 is bad
192.168.0.25 is bad
…………………………….
210.14.156.210 is ok
210.14.130.130 is ok
117.79.235.238 is ok
 
real    0m6.247s
user   0m0.056s
sys    0m0.349s
时间: 2024-10-16 18:00:02

shell模拟并发执行的相关文章

【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行

背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比如最大在100Mb/s,如果直接启动100个scp,则又会遇到ssh的并发连接数限制. 所以需要控制并发数,即不超过ssh的并发限制,又要让单网卡上的带宽接近饱和,尽快完成传输(假设专线带宽远大于单机网卡带宽) 实现 之前知道通过mkfifo创建一个命名管道,可以实现对并发的控制.现在来实现一个.

linux shell 创建并发后台执行任务并等待任务执行完成

#!/bin/bash echo "i am main" for i in $(seq 1 5) do { sleep 10; echo "i am $i"; }& done wait http://www.cnblogs.com/dorothychai/archive/2012/10/19/2730374.html linux shell 创建并发后台执行任务并等待任务执行完成

Shell脚本中的多任务并发执行

正常情况下,Shell脚本中的命令是串行执行的,当一条命令执行完才会执行接下来的命令.比如下面这段代码: #!/bin/bash for i in {1..10};do echo $i done echo "END" 执行结果: 1 2 3 4 5 6 7 8 9 10 END 可以看到,循环体中的"echo $i"命令是串行执行的.但是如果所执行的命令耗时比较长,这就会导致整个程序的执行时间非常长,甚至可能导致程序执行时卡在那里,长时间失去响应.比如我们需要完成这

Linux Shell多进程并发以及并发数控制

1. 基础知识准备 1.1. linux后台进程 Unix是一个多任务系统,允许多用户同时运行多个程序.shell的元字符&提供了在后台运行不需要键盘输入的程序的方法.输入命令后,其后紧跟&字符,该命令就会被送往到linux后台执行,而终端又可以继续输入下一个命令了. 比如: sh a.sh & sh b.sh & sh c.sh & 这三个命令就会被同时送往linux后台执行,在这个程度上,认为这三个命令并发执行了. 1.2. linux文件描述符 文件描述符(缩

尝试php命令行脚本多进程并发执行

php不支持多线程,但是我们可以把问题转换成“多进程”来解决.由于php中的pcntl_fork只有unix平台才可以使用,所以本文尝试使用popen来替代.  下面是一个例子:  被并行调用的子程序: <?php if($argc==1){ echo("argv\n"); } $arg = $argv[1]; for($i=0; $i<10; $i++) { echo($i.".1.".time()." exec $arg \n")

C# 模拟并发

每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客! 当然,题外话说多了,咱进入正题! 在处理大数据的时候,经常会发生并发,并发的情况发生后,会出现数据污读,从而产生脏数据. 首先通过一段程序进行说明.<有兴趣的小伙伴可以复制粘贴这段程序>. 项目背景:模拟大转盘抽奖程序. 场下坐有近万名群众,他们在同一时刻同时抽奖,奖品分为一等奖:奔驰汽车10辆,二等奖:别克汽车20辆,三等奖:现代汽车30辆.(奖品信息存入数据库) 奖品信息如下(数据库部分): create tabl

002-Shell的并发执行原理及其实现

1.正常执行 如果是多个命令执行的话,默认是串行执行的.如果前面的一个任务没有执行完成,后面的任务就无法执行,即不可能将指令置于CPU上执行. sleep 10 后台执行.Default模式下,shell命令是阻塞执行的,可以通过其后添加&让这条命令异步执行,如: sleep 10 & 执行这条命令后,并不会阻塞10秒,而是立即返回. 2.并行执行 注意:这里的并行执行如果是单核CPU的话,实际上指的是并发执行.并发执行是具备并行执行的前提因素. 如果将这种方法用在while循环中,则可以

[Linux]shell多进程并发—详细版

业务背景 schedule.sh脚本负责调度用户轨迹工程脚本的执行,截取部分代码如下: #!/bin/bash source /etc/profile; export userTrackPathCollectHome=/home/pms/bigDataEngine/analysis/script/usertrack/master/pathCollect ############################## # # 流程A # ##############################

hive 实现job并发执行

hive里,同一sql里,会涉及到n个job,默认情况下,每个job是顺序执行的. 如果每个job没有前后依赖关系,可以并发执行的话,可以通过设置该参数 set hive.exec.parallel=true,实现job并发执行,该参数默认可以并发执行的job数为8. set hive.exec.parallel=true; 例如: sql=""" set hive.exec.parallel=true; use database; select a,b,c from ( s