标签:文件 命名管道 进程 文件描述符fd 控制 sleep 新建 一个 exit
1. 多线程并发执行任务,而不用一台台的串行执行,能更快更高效
2. Shell并没有多线程的概念,所以:
* 一般使用wait、read等命令技巧性地模拟多线程实
* 使用命名管道(fifo)来实现多线程的控制
3. 用途:需要对多主机批量执行检查或操作时(例如ssh、ping等操作)
tmp_fifofile="/tmp/$$.fifo" mkfifo $tmp_fifofile #新建fifo类型的文件 exec 5<>$tmp_fifofile #将fd 5指向fifo类型 rm $tmp_fifofile #可删除 #这里的$$.fifo/5都是一个文件名而已,可随意
thread=5 # $thread 定义的是线程数,thread=5的意思是每次最多同时执行5个线程 #写一个for循环随便echo个字符在5这个文件中,实际上我们就是通过对这个字符的数量控制来实现对线程数量的控制的 for ((i=0;i<$thread;i++)) do echo done >&5
# 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
wait #等待所有子进程结束 exec 5>&- #关闭fd 5 exit 0 #成功退出
我们的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
标签:文件 命名管道 进程 文件描述符fd 控制 sleep 新建 一个 exit
原文地址:http://www.cnblogs.com/snsdzjlz320/p/7238998.html