Shell 都以串行的方式自上而下执行命令,不适用需要大量作业的场景。
学习此篇shell脚本进程并发,能够大大提高工作效率~
通过wait 和 & 后台符号 可以实现并行,但无法控制进程数。

{task
}&
done
wait

{} 将主执行程序变为一个块,使用&放入后台
wait 函数等待所有后台进程执行程序,否则继续执行后续命令直到整个脚本结束

通过有名管道控制并发进程数

创建一个fifo文件, 作为进程池, 里面存放一定数目的"令牌".作业运行规则如下: 所有作业排队依次领取令牌; 每个作业运行前从进程池中领取一块令牌, 完成后再归还令牌; 当进程池中没有令牌时, 要运行的作业只能等待. 这样就能保证同时运行的作业数等于令牌数.

管道 = = 》有名管道、无名(匿名)管道
有名管道:mkfilo 创建一个管道文件
有名管道: “cat 1.file | grep ‘xxx’ ” “|” ==》创建一个无名管道,直接作为两个进程的数据通道

exec 自行定义,绑定文件操作符

系统默认三个文件操作符 0、1、2 = = 》 stdin、stdout、stderr
ls /proc/self/fd

模板

#!/bin/bash
trap "exec 6>&-;exec 6<&-;wxit 0" 2
#接受2 程序终止(interrupt)信号 "ctrl c" 后的操作。关闭fd6
tmp_fifofile=/tmp/$$.fifo        //$$ 进程pid
mkfifo $tmp_fifofile             //创建为进程pid的管道//我常用$((RANDOM)),大概率的避免与已有文件重复
exec 6<>$tmp_fifofile           //以6为文件描述符fd打开管道 <>代表读写
rm $tmp_fifofile
thread=250                      //定义并发进程数量,上文的令牌数量
#在fd6中放入$thread 个空行作为令牌
for ((i=0; i<=$thread;i++))
doecho
done >&6
for i in ``                              //可以省略,直接在{}括号内添加执行命令
doread -u6                             //read 读取行,领取令牌              {echo >& 6                            //归还令牌
}&                                       //{ }&放入后台
done
wait                                     //等待所有后台子进程结束
exec 6>&-                                //关闭fd6
exec 6<&-                                //关闭fd6

结束

学术不精。欢迎评论一起讨论!~

附上一个自己写的使用并发,检查大批量站点的域名检测脚本
将待检查的脚本放入指定目录就行了~

#!/bin/bash#创建今日目录
if [ ! -d "./$(date +%y-%m-%d)" ];thenmkdir -p /script/$(date +%y-%m-%d)
fi
dir=/script/$(date +%y-%m-%d)function global()
{
#第一次curl检测
tmp_fifofile=/tmp/$(($RANDOM%1000)).fifo
mkfifo $tmp_fifofile
exec 6<>$tmp_fifofile
rm $tmp_fifofile
thread=256
for ((i=0; i<=$thread;i++))
doecho
done >&6for ((i=0;i<=$thread;i++))
doecho >&6
donefor i  in `cat /script/domain/$url`
doread -u6{code=$(curl -o /dev/null --retry 2 --connect-timeout 10 -s -w %{http_code} $i)echo "$code $i" >> $dir/$url-first.logecho >& 6
}&done
wait
exec 6>&-
exec 6<&-
grep -v '200\|301\|302'  $dir/$url-first.log  |tail -n +2  |awk -F' ' '{print $2}' > $dir/$url-second.log
rm -f $dir/$url-first.log
#第二次wget检测
tmp_fifofile=/tmp/$(($RANDOM%1000)).fifo
mkfifo $tmp_fifofile
exec 6<>$tmp_fifofile
rm $tmp_fifofile
thread=128
for ((i=0; i<=$thread;i++))
doecho >&6
donefor i in `cat $dir/$url-second.log`
doread -u6{wget -T 10 --spider -t 2 $i &>/dev/null $i >> /dev/nullif [ $? = 0 ];thenecho $i >> /dev/nullelseecho $i >> $dir/$url-third.logfiecho >& 6
}&
done
wait
exec 6>&-
exec 6<&-
rm -f $dir/$url-second.log#第三次curl检测
tmp_fifofile=/tmp/$(($RANDOM%1000)).fifo
mkfifo $tmp_fifofile
exec 6<>$tmp_fifofile
rm $tmp_fifofile
thread=128
for ((i=0; i<=$thread;i++))
doecho >&6
donefor i  in `cat $dir/$url-third.log`
doread -u6{code=$(curl -o /dev/null --retry 2 --connect-timeout 10 -s -w %{http_code} $i)echo "$code $i" >> $dir/$url-fourth.logecho >& 6
}&done
wait
exec 6>&-
grep -v '200\|301\|302'  $dir/$url-fourth.log  |tail -n +2   >> $dir/last.log
rm -f $dir/$url-third.log
rm -f $dir/$url-fourth.log}function last (){
grep -v '200\|301\|302' $dir/last.log |awk -F' ' '{print $2}' >> $dir/last2.log
rm -f $dir/last.log
tmp_fifofile=/tmp/last.fifo
mkfifo $tmp_fifofile
exec 6<>$tmp_fifofile
rm $tmp_fifofile
thread=64
for ((i=0; i<=$thread;i++))
doecho
done >&6for ((i=0;i<=$thread;i++))
doecho >&6
donefor i  in `cat $dir/last2.log`
doread -u6{code=$(curl -o /dev/null --retry 2 --connect-timeout 10 -s -w %{http_code} $i)echo "$code $i" >> $dir/last3.logecho >& 6
}&
done
wait
exec 6>&-
exec 6<&-
rm -f $dir/last2.log
echo "请手动复核以下域名:" > $dir/$(date +%H-00)domain.log
grep -v '200\|301\|302' $dir/last3.log >> $dir/$(date +%H-00)domain.log
rm -f $dir/last3.log
}function main ()
{
tmp_fifofile=/tmp/main.fifo
mkfifo $tmp_fifofile
exec 8<>$tmp_fifofile
rm $tmp_fifofile
thread=2
for ((i=0; i<=$thread;i++))
doecho
done >&8for url in `ls -l /script/domain/ | tail -n +2 | awk -F' ' '{print $9}'`
doread -u8
{global $urlecho >& 8
}&done
wait
exec 8>&-
exec 8<&-}main
last
mail -s "检测结果来自xx服务器 :" xxxxxxxx@qq.com < $dir/$(date +%H-00)domain.log 

转载于:https://www.cnblogs.com/hehehe886/p/9150418.html

Shell 脚本进程并发进程数控制相关推荐

  1. linux用shell脚本写游戏,shell脚本实现猜数游戏

    用shell脚本写一个猜数游戏 最近用shell写的一个猜数游戏,包括4个不同难度,脚本如下: #作者:p_小王 echo '欢迎来到猜数游戏!' while true do read -p '开始/ ...

  2. 【shell】shell脚本实战-循环的控制

    文章目录 前言 break和continue的区别 三种方式的对比案例 1. break 跳过整个循环 2. continue跳过当次循环 3. exit退出脚本 实战案例 总结 前言 在我们使用循环 ...

  3. Shell脚本中的流程控制,如if判断,case语句,for循环,while循环

    一.流程控制 1.if 判断 1.基本语法 if [ 条件判断式 ];then程序 fi 或者 if [ 条件判断式 ]then程序 fi 注意事项: (1)[ 条件判断式 ],中括号和条件判断式之间 ...

  4. Linux基础篇学习—shell及shell脚本

    概述 shell概念 shell又称命令解释器,它能识别用户输入的各种命令,并传递给操作系统 它的作用类似于Windows操作系统中的命令行,但是,Shell的功能远比命令行强大的多:在UNIX或者l ...

  5. 写好shell脚本的8个建议

    ​这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训.事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条. 1. 指定bash shell 脚本的第一行,# ...

  6. shell脚本编程for循环求阶乘_shell脚本编程(完结版).pdf

    shell脚本编程(完结版) Shell 脚本编程学习笔记 2013 年 5 月 2 日 追风~忆梦 如有任何疑问,请联系作者,作者 QQ:1028150787,或者到韦东山群共同讨论 1 Shell ...

  7. 将PHP作为Shell脚本语言使用

    我们都知道.PHP是一种非常好的动态网页开发语言(速度飞快.开发周期短--).可是仅仅有非常少数的人意识到PHP也能够非常好的作为编写Shell脚本的语言,当PHP作为编写Shell脚本的语言时,他并 ...

  8. Shell 脚本调用另一个脚本的三种方法

    文章目录 1.source 2.点号. 3.sh 命令 4.三者的区别 5.export 命令设置临时环境变量 6.export 命令设置永久环境变量 参考文献 假如有脚本 first.sh: #!/ ...

  9. Shell脚本循环语句及exit、continue和break用法

    目录 一.for循环语句 二.while循环语句结构 三.until 循环语句结构 四.exit.continue和break 一.for循环语句 用法: 读取不同的变量值,用来逐个执行同一组命令 f ...

  10. shell脚本 sh shebang “#!/bin/sh“

    省流 shell脚本第一行,一般会见到 #!/bin/sh,这个的作用,最明显的是搜进程的时候可以搜到进程名. 示例 设置shell脚本的进程名称 #!/bin/sh while [ true ]; ...

最新文章

  1. 4_Shell语言———脚本概述
  2. 应用营销策略知多少?
  3. boost::bucket_sorter用法的测试程序
  4. python之禅星号_Python基础1
  5. C和汇编混合编程---do while
  6. 摄像头大数据分析跟踪均值漂移算法-spark和python
  7. 物理层协议:RS-232-C、RS-449、V.35、X.21
  8. 2021年中国助听器市场趋势报告、技术动态创新及2027年市场预测
  9. linux远程仿真,11.5 仿真的远程桌面系统: XRDP 服务器
  10. 关于指令执行周期的细节思考
  11. python自动化是什么意思_浅谈 Python 自动化
  12. wordpress php 模板修改,教你如何修改wordpress模版技巧分享
  13. innodb 删除隐藏列_MySQL进阶之InnoDB事务原子性实现原理
  14. mysql编写触发器语法_mysql触发器语法
  15. 软件开发的心得体会(二)
  16. excel添加水印及设置打印参数poi
  17. git gui here如何汉化_github的git GUI Here的使用,适合新手!!!
  18. Android 自定义视频录制终极解决方案(翻转问题)
  19. 如何修改网页视频播放倍速?(最高16倍速)
  20. 3D游戏角色模型的简单制作流程

热门文章

  1. 拓端tecdat|二手闲置物品交易数据快照
  2. actor模型 java框架,actor模型(actor模式优缺点)
  3. Qpython 获取Android gps信息
  4. cv2不能读取中文路径
  5. keras(X_train, X_test, y_train, y_test)
  6. caffe/build/tools下会生成一些工具
  7. 基于卷积网络的度量学习
  8. python数字图像处理(9):直方图与均衡化
  9. 基于微博数据的人物性格分类系统
  10. matlab物理应用编程,MATLAB在普通物理中的应用