废话不多说,直接上脚本。下面的脚本可以直接执行看效果
#!/bin/bash

set -e

# 设置并发数
PROC_NUM=10

# 以主进程PID命名管道文件
FIFO_FILE="/tmp/$$.fifo"

# 新建管道文件
mkfifo ${FIFO_FILE}

# 生成文件描述符9指向管道文件;"<"表示可读,">"表示可写
exec 9<>${FIFO_FILE}

# 向文件描述符中写入设置的并发数量的行数,模拟生成进程池;一行就是一个子进程
for process_num in $(seq ${PROC_NUM})
do
          echo "$(date +%F\ %T) Processor-${process_num} Info: " >&9
done

# 按并发数设置执行任务
for n in $(seq 100)
do
          # 从文件描述符中读取一行,读到后生成子进程向下执行,读不到就等待;模拟进程锁
          read -u 9 P
          {
             # 子进程执行的实际任务
             echo "${P} "
             sleep(2)
             # 将从文件描述符中读取的内容重新写回文件描述符;模拟释放进程锁
             echo ${P} >&9
            } &
done

wait

echo "All Completed"

# 删除文件描述符
exec 9>&-

# 删除临时管道文件
rm -f ${FIFO_FILE}

exit 0