#!/bin/bash trap "exec 1000>&-;exec 1000<&-;exit 0" 2 # trap 接收信号 # 当接收到信号2(SIGINT ),ctrl+c的动作,关闭1000的文件描述符 mkfifo testfifo # 创建管道文件 exec 1000<>testfifo # 绑定管道文件与文件描述符,解决管道文件,只读或只出会阻塞的问题 rm -rf testfifo # 删除管道文件,1000文件描述符仍具有管道文件的功能 for ((n=1;n<=10;n++)) do echo >&1000 done # 1000文件描述符加入10个空行,效果如令牌桶,限制并发数量为10。 start=`date "+%s"` for ((i=1;i<=50;i++)) do read -u1000 { echo success$i;sleep 2 echo >&1000 }& done # 并发任务50组,每次输出success,等待两秒。 # read -u1000使用1000文件描述符读取一行,拿一个令牌 # echo >&1000,拿走令牌,同样需加入一个令牌,保持令牌桶中的令牌数量。 # '&'后台执行,每次新开一个子进程执行任务,不阻塞。 wait # 等待以上代码执行完毕,继续执行 end=`date "+%s"` echo "TIME: `expr $end - $start`" exec 1000>&- exec 1000<&- # 关闭文件描述符1000