shell 实现多线程

Posted on Posted in bash
Tips: 本文创建于2016年4月5日,已超过 2 年,内容或图片可能已经失效!

1、正常脚本

  1. # !/bin/bash   
  2. for  ((i = 0 ;i < 5 ;i ++ )); do   
  3.         {  
  4.                  sleep   3 ;echo  1 >> aa  &&  echo  " done! "   
  5.         }   
  6. done  
  7. wait   
  8. cat aa | wc  - l  
  9. rm aa  

2、多线程

  1. # !/bin/bash   
  2. for  ((i = 0 ;i < 5 ;i ++ )); do   
  3.         {  
  4.                  sleep   3 ;echo  1 >> aa  &&  echo  " done! "   
  5.         }  &   
  6. done  
  7. wait   
  8. cat aa | wc  - l  
  9. rm aa  

3、控制并发数的进程脚本

  1. #!/bin/bash  
  2. #往往用于多主机检查,比如ssh登录、ping等等这种单进程比较慢而不耗费cpu的情况  
  3. function a_sub {    #  此处定义一个函数,作为一个线程(子进程)   
  4. sleep 3 #  线程的作用是sleep 3s   
  5. }  
  6. tmp_fifofile="/tmp/$$.fifo"  
  7. mkfifo $tmp_fifofile    #  新建一个fifo类型的文件   
  8. exec 6<>$tmp_fifofile   #  将fd6指向fifo类型   
  9. rm $tmp_fifofile  
  10.   
  11. thread=15   #  此处定义线程数   
  12. for (( i=0 ; i<$thread ; i++ )); do  
  13. echo  
  14. done >& 6   #  事实上就是在fd6中放置了$thread个回车符   
  15.   
  16. for(( i=0; i<50; i++)); do   #  50次循环,可以理解为50个主机,或其他   
  17. read -u6  
  18.  #  一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,  
  19.  # fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制  
  20. {     #  此处子进程开始执行,被放到后台  
  21.     a_sub &&{   #  此处可以用来判断子进程的逻辑   
  22.         echo "a_sub is finished"  
  23.     } || {  
  24.         echo "sub error"  
  25.     }  
  26.     echo >& 6   #  当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个  
  27. } &  
  28. done  
  29.   
  30. wait    #  等待所有的后台子进程结束  
  31. exec 6>&-    #  关闭df6   
  32.   
  33. exit 0  
» 转载请注明来源:若我若鱼 » shell 实现多线程

Leave a Reply

Your email address will not be published. Required fields are marked *

20 − nine =