shell 并发脚本

#!/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
原文地址:https://www.cnblogs.com/yunweixiaoxuesheng/p/8675808.html