shell 并发控制

items="a b c d e f g"
# 根据进程id生成管道文件名称,“$$” 在shell中代表当前进程id
fifo_file=/tmp/$$.fifo
# 创建一个管道文件
mkfifo ${fifo_file}
# 捕获信号量2也就是SIGNAL_INT时,将文件描述符与管道解绑,并退出进程
trap "exec 8>&-;exec 8<&-;exit 0" 2
# 将管道与文件描述符8绑定,这里也可以是其他
exec 8<>${fifo_file}
# 将临时文件删除,因为此时该文件指代的管道已经与文件描述符8进行了绑定, 已经是无用的了
rm -f ${fifo_file}
# 向管道中添加token,数量是3,也就是最大并发数
for (( i=0; i<3; i++ )) ; do
    echo >&8
done

for item in ${items} ; do
    # 从文件描述符8读取一行,也就是一个token,如果没有,就会阻塞
    read -u8
    {
        echo $item
        sleep 5
        # 执行完成后想文描述符8放入一个token
        echo >&8
    } &  #以子进程的方式执行花括号内的内容
    done
#等待所有子进程返回
wait

你可能感兴趣的:(shell 并发控制)