首页 Linux Bash中操作指定线程数完成批量任务

Bash中操作指定线程数完成批量任务

ASP站长网预备知识:
 
文件描述符:
 
查看:当前终端的描述符在/dev/fd
 
或echo $$ 查看当前终端进程号,去/proc/进程号/fd中找
 
基本用法
 
exec fd<>file                #创建一个文件句柄 ,0,1,2为保留文件句柄不能使用                                 
 
exec fd>&-  or  exec -fd<&    #关闭文件句柄,从哪个终端创建要在同一个终端关闭
 
使用指定线程的一个例子:
 
#!/bin/bash
#
WD=192.168.1.
THREAD=30    #要开启的进程数
TMPFIFO=/root/test/$$.fifo      #临时管道文件
mkfifo $TMPFIFO    #创建临时管道文件
exec 1000<>$TMPFIFO   #创建管道文件管理的文件句柄1000
rm -rf $TMPFIFO          #删除临时管道文件
 
for ((i=1;i<=$THREAD;i++));do
        echo
done >&1000  #循环写入回车符到管道,后面借用read命令一次读取一行的特性,来确保每一行只有一个线程占位;
                        这里让人联想到生产者&消费者模型,管道文件充当消息队列,来记录消费者的需求,然后由生产者
                        去领任务,并完成任务,这里运用了异步解耦的思想。
 
for i in `seq 1 255`;do
        read -u1000    #从文件描述符管道中,获取一个管道的线程占位然后开始执行操作;read中-u后面跟fd,
                            表示从文件描述符中读入,该文件描述符可以是exec新开启的。
        {
        ping -c 1 -w 1 $WD$i &>/dev/null
        [ $? == 0 ] && echo "$WD$i is up" || echo "$WD$i is down"
        echo "" >&1000  #任务执行完后在fd5中写入一个占位符,以保证这个线程执行完后,线程继续保持占位,
                            继而维持管道中永远是50个线程数,&表示该部分命令/任务放入后台不占当前的bash,
                            实现并行处理
        }&
done >> result.txt
wait                #等待父进程的子进程都执行结束后执行后续操作
echo "Hello,world"
exec 1000>&-        #释放文件句柄
exit 0

关于作者: dawei

【声明】:九江站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

热门文章