shell多线程

关于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 World

real    0m12.064s
user    0m0.020s
sys     0m0.042s
时间: 2024-08-28 18:39:15

shell多线程的相关文章

linux shell 多线程执行程序

Shell中并没有真正意义的多线程,要实现多线程可以启动多个后端进程,最大程度利用cpu性能. 直接看代码示例吧. (1) 顺序执行的代码 1 #!/bin/bash 2 date 3 for i in `seq 1 5` 4 do 5 { 6 echo "sleep 5" 7 sleep 5 8 } 9 done 10 date 输出: Sat Nov 19 09:21:51 CST 2016 sleep 5 sleep 5 sleep 5 sleep 5 sleep 5 Sat N

Linux Shell 多线程编程--原创

相关命令文件 1.runCommandInThreads.sh 多线程实现主代码 cdir=$(dirname $BASH_SOURCE) ##Current directory of this script file. source $cdir/logUtil.sh function createFile() { local dir=$1 local idx=$2 local fl="$dir/$idx" touch $fl } function execShellCommand()

Linux Shell 多线程编程

#!/bin/bash #---------------------------–  # 此例子说明了一种用wait.read命令模拟多线程的一种技巧  # 此技巧往往用于多主机检查,比如ssh登录.ping等等这种单进程比较慢而不耗费cpu的情况  # 还说明了多线程的控制  #---------------------------– function a_sub { # 此处定义一个函数,作为一个线程(子进程)    sleep 3 # 线程的作用是sleep 3s  } tmp_fifof

Shell多线程脚本

<--目录--> 1)多线程概述 2)多线程脚本内容 3)多线程脚本执行时间 4)单线程脚本内容 5)单线程脚本执行时间 [多线程概述] # 多线程指并发执行任务,而不是一台一台的串行来执行任务,这样可以更快且更高效的利用资源 # 我们来描述一下怎么准确控制并发数目 # 下面例子说明了一种用wait.read命令模拟多线程的一种技术技巧 # 此技巧往往用于多主机检查,比如ssh登陆.ping等等这种单进程比较慢而不耗费CPU的情况 # 还说明了多线程的控制 [多线程脚本内容] #!/bin/b

Shell多线程编程的实例

#!/bin/bash # a_sub(){     sleep 5 } Multi_Thread(){     THREAD=5             # 此处定义线程数     TMP_FIFO="/tmp/$.fifo"     /usr/bin/mkfifo $TMP_FIFO    # 新建一个fifo类型的文件     exec 6<>$TMP_FIFO     /bin/rm -f $TMP_FIFO      # 将fd6指向fifo类型     for 

shell多线程控制

#!/bin/bash # current time:2016-11-02 16:14:56 LANG=en_US.UTF-8 start=`date +%s` thread=80 mkfifo ugc exec 4<>ugc for ((i=0;i<$thread;i++)) do echo -ne "\n" 1>&4 done while read line do { read -u 4 { curl -r 0-1 -o /dev/null &quo

[ SHELL编程 ] shell多线程操作实例

1.需求 查找192.168.0.*网段中所有未使用过的IP 2.实现     我们知道查找未使用IP的方法可以使用ping命令完成.对于单个IP的判断,使用命令如下 $ ping -c 1 192.168.0.1 PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data. 64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.031 ms --- 192.168.0.1 ping statistic

shell多线程之进程间通信

# 这是一个简单的并发程序,有如下要求: # 1.有两个程序a和b,希望他们能并发执行,以节约时间 # 2.a和b都是按照日期顺序执行,但b每日程序的前提条件是当日a的程序已经执行完毕 #解决方案: # 1.创建一个文件描述符作为pipe,a程序每次执行完就把一个日期发送给pipe,然后继续执行 # 2.b程序每次执行时先从pipe读取a的日期,如果a的日期>=b的日期,则b继续执行,否则阻塞. [ -e /tmp/fd5 ] || mkfifo /tmp/fd5 exec 5<>/tm

shell多线程快速检测内网ip是否存活

!/bin/bash#Check the network is onlinecat /dev/null > ip_yes.txtcat /dev/null > ip_no.txtip_num="192.168.0"read -p "Enter your network segment(Default ip: 192.168.0):" ip_numif [ "$ip_num" = "" ];thenip_num=&q