关于shell的多线程

1. 多线程并发执行任务,而不用一台台的串行执行,能更快更高效

2. Shell并没有多线程的概念,所以:

* 一般使用wait、read等命令技巧性地模拟多线程实

* 使用命名管道(fifo)来实现多线程的控制

3. 用途:需要对多主机批量执行检查或操作时(例如ssh、ping等操作)

分段解析一个例子来理解一个多线程脚本的书写

1. 新建fifo类型文件

tmp_fifofile="/tmp/$$.fifo"
mkfifo $tmp_fifofile #新建fifo类型的文件
exec <>$tmp_fifofile #将fd 5指向fifo类型
rm $tmp_fifofile #可删除
#这里的$$.fifo/5都是一个文件名而已,可随意

2. 定义线程数,循环键入字符,通过字符控制实现线程数量控制

thread=                  # $thread 定义的是线程数,thread=5的意思是每次最多同时执行5个线程
#写一个for循环随便echo个字符在5这个文件中,实际上我们就是通过对这个字符的数量控制来实现对线程数量的控制的
for ((i=;i<$thread;i++))
do
echo
done >&

3. 执行任务

# read -u <fd>命令的意义是:read input from file descriptor fd. 读取来自文件描述符fd的输入
# 实际上我们是通过“read -u 5”来实现每次从5中减去一个字符, job_num= # $job_num定义了总的任务数
for ((i=;i<$job_num;i++))
do
read -u5 {
  sleep && echo "Hello World" || echo "Hello error"
  ......                      ===>这些部分就是我们要执行的命令,可封装成函数
  ...... echo >& #多加回一个字符
}&
done

4. 等待、关闭、退出

wait       #等待所有子进程结束
exec >&- #关闭fd 5
exit #成功退出

5. 执行结果

我们的job_num有20个,thread定义了5个
即每5个每5个这样执行
一共需要执行4次(单线程就要执行20次了)
每次执行是3s,所以共花费3*4=12s # time sh dxc.sh
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World real 0m12.064s
user 0m0.020s
sys 0m0.042s

参考文章

使用shell脚本(bash脚本)模拟多线程

Shell多线程脚本

阮一峰-进程线程的简单解释

[shell进阶]——shell多线程的更多相关文章

  1. shell脚本的多线程

    shell脚本的多线程 #!/bin/bash ###这是个多线程脚本!!!! ..} do { .$i >/dev/null ];then echo "192.168.2.$i 存活 ...

  2. Shell进阶精品课程

    课程链接 Shell精品进阶教程:理解Shell的方方面面 课程目标 系统性的掌握shell相关知识,进阶shell脚本能力,对shell各方面了然于心 适用人群 具备shell基础但想深入.系统性掌 ...

  3. 自学linux——12.shell进阶

    Shell进阶 当把在Windows中写好的脚本传到linux中使用时,在Windows下每一行结尾是\n\r,而Linux下则是\n,所以会多出来\r,在linux中运行脚本时,需执行: sed - ...

  4. 转:shell 经典, shell 十三问

      原文链接:http://blog.csdn.net/freexploit/article/details/626660 我在 CU 的日子并不长,有幸在 shell 版上与大家结缘.除了跟众前辈学 ...

  5. [拾 得] 一枚迷人的贝壳 SHELL / Linux | shell 脚本初步入门

    坚持知识分享,该文章由Alopex编著, 转载请注明源地址: http://www.cnblogs.com/alopex/   索引: 什么是shell shell的分类 shell脚本的执行方式   ...

  6. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)

    [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...

  7. [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中)

    [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中) 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET ...

  8. [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上)

    [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上) 本节导读: 随着硬件和网络的高速发展,为多线程(Multithreading) ...

  9. [翻译].NET Shell Extensions - Shell Context Menus---.net 外壳扩展-右键菜单

    我自己的前言说明: 本文原作者为    Dave Kerr,原文链接为.NET Shell Extensions - Shell Context Menus:,我是在为了完成最新需求的时候查询资料的时 ...

随机推荐

  1. django drf CreateModelMixin和Serializer.validate_columun

    view demo class ValidateCodeSet(mixins.CreateModelMixin, viewsets.GenericViewSet): serializer_class ...

  2. JS获取节点属性个数及值得方法

    var ex = node; ; for (var j in ex) { alert("" + myIndex + ".(<font color='blue'> ...

  3. Web开发利器Webstorm导入多个文件夹或者项目

    步骤:File->Setting 打开设置面板,打开Directories节点,然后看到有Add Content Root 操作选项,单击弹出磁盘目录文件,选择对应项目或者目录即可.

  4. java.lang.IllegalStateException: Cannot call sendError() after the response has been committed解读

    源代码: @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Ob ...

  5. javaweb从mysql中获取数据验证用户名密码成功跳转,失败重新验证

    要求:validate.jsp页面中获取请求参数(request.getparameter(“name属性的值”)),注意中文参数获取之前要设置请求编码(request.setCharaterEnco ...

  6. BZOJ4012 [HNOI2015]开店 (动态点分治)

    Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...

  7. memcache内存存储

    memcache的内存分配默认是采用了Slab Allocator的机制分配.管理内存.在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的. 但是,这种方式会导致内存 ...

  8. Linux下安装pip(遇到了python2.6升级为python2.7道路上的坑,原因已经找到,只差临门一脚了,以后补上)

    1.先说一下什么是pippip 是“A tool for installing and managing Python packages.”,也就是说pip是python的软件安装工具2.下面介绍怎么 ...

  9. linux防火墙(五)—— 防火墙的规则备份与还原

    一.第一种备份还原用法,使用工具 iptables-save >/opt/iprules.txt iptables-restore < /opt/iprules.txt #注意导入的文件必 ...

  10. Express-及中间件的简单理解

    Express Express 是一个基于node平台,保持最小规模的灵活的 Node.js Web 应用程序开发框架,在Node.js基础上扩展对了web应用开发所需要的基础功能为 Web 和移动应 ...