关于shell的多线程

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

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

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

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

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

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

1. 新建fifo类型文件

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

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

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

3. 执行任务

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

4. 等待、关闭、退出

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

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 Worldreal    0m12.064s
user    0m0.020s
sys     0m0.042s

参考文章

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

Shell多线程脚本

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

转载于:https://www.cnblogs.com/snsdzjlz320/p/7238998.html

[shell进阶]——shell多线程相关推荐

  1. shell十三问--shell教程

    为什么80%的码农都做不了架构师?>>>    13_questions_of_shell shell十三问--shell教程(markdown 版本) ##shell十三问之1: ...

  2. shell 经典, shell 十三问

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

  3. shell经典,shell十三问

    我在 CU 的日子并不长,有幸在 shell 版上与大家结缘.除了跟众前辈学习到不少技巧之外,也常看到不少朋友的问题.然而,在众多问题中,我发现许多瓶颈都源于 shell 的基础而已.每次要解说,却总 ...

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

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

  5. Shell 和Shell Script 基础

    转自:http://www.study-area.org/linux/system/linux_shell.html 认识SHELL 或许﹐许多人都已经听过shell 或bash 这些名字﹐但不知道您 ...

  6. ZT shell经典,shell十三问

    我在 CU 的日子并不长,有幸在 shell 版上与大家结缘.除了跟众前辈学习到不少技巧之外,也常看到不少朋友的问题.然而,在众多问题中,我发现许多瓶颈都源于 shell 的基础而已.每次要解说,却总 ...

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

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

  8. Bourne Shell及shell编程

    Bourne Shell及shell编程<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office ...

  9. 【shell】shell编程(一)-入门

    如今,不会Linux的程序员都不意思说自己是程序员,而不会shell编程就不能说自己会Linux.说起来似乎shell编程很屌啊,然而不用担心,其实shell编程真的很简单. 背景 什么是shell编 ...

最新文章

  1. javaweb上传文件_javaWeb中,如何通过CommonsFileUpload组件上传文件
  2. jmap 文件解析_干货分享丨jvm系列:dump文件深度分析
  3. select2,利用ajax高效查询大数据列表(可搜索、可分页)
  4. 让孩子见世面,到底有多重要
  5. ireport 怎么使用in查询
  6. 离散数学期末复习概念_复习第1部分中的基本概念
  7. oracle into关键字,oracle - INTO保留关键字不能用作标识符 - 堆栈内存溢出
  8. 从零开始学习Android开发
  9. redies常用命令
  10. PSPnet网络结构搭建
  11. html五子棋游戏(附源码)
  12. Spring cloud搭建HSF框架,整合mybatis、redis、rabbit
  13. 为什么现在不看好 CV 方向了呢?
  14. STM32内部ADC基准电压计算方法
  15. linux ssd做raid1,linux 磁盘阵列 raid1搭建教程
  16. vue组件中引入public文件,build打包后找不到资源报错404
  17. 当你写爬虫抓不到APP请求包的时候该怎么办?【高级篇-混淆导致通用Hook工具失效】
  18. 实习日记——Day36
  19. 泰州学院计算机与机械学院副院长,2020届考研学子风采展示
  20. 几年前之所预言,其人不死言之依然

热门文章

  1. 深度解析大数据可视化管理平台的监控功能
  2. 数据挖掘与数据化运营实战. 3.8 用户(买家、卖家)分层模型
  3. SSH 中从后台传值到前台JSP,传不过去问题
  4. 青云SDN/NFV2.0架构剖析
  5. 安装DNN时可能出现的错误
  6. git 简易指南+常用命令
  7. 从open系统调用的源码看文件的打开过程
  8. ImageView---属性android:background与android:src的区别
  9. OpenCV中cvAdds和cvAdd中的mask的用法探讨
  10. Matlab图像剪切,超出图像区域指定颜色填充