实现方案:
1.命令结尾添加:&
#/bin/bash all_num=10 a=$(date +%H%M%S) for num in `seq 1 ${all_num}` do { sleep 1 echo ${num} } & done b=$(date +%H%M%S) echo -e "startTime: $a" echo -e "endTime: $b"
在命令的末尾加 & 符号,则命令将在后台执行,这样后面的命令不需要等待该命令执行完再开始执行。
2.解决主线程提前退出问题,添加 wait
#/bin/bash all_num=10 a=$(date +%H%M%S) for num in `seq 1 ${all_num}` do { sleep 1 echo ${num} } & # 将命令在后台执行,命令范围用{}包围 done # 等待当前脚本进程下的子进程结束 wait b=$(date +%H%M%S) echo -e "startTime: $a" echo -e "endTime: $b"
3.控制后台执行数(线程数),mkfifo
#/bin/bash all_num=10 # 设置并发的进程数 thread_num=5 a=$(date +%H%M%S) # mkfifo tempfifo="my_temp_fifo" mkfifo ${tempfifo} # 使文件描述符为非阻塞式 exec 6<>${tempfifo} rm -f ${tempfifo} # 为文件描述符创建占位信息 for ((i=1;i<=${thread_num};i++)) do { echo } done >&6 # for num in `seq 1 ${all_num}` do { read -u6 { sleep 1 echo ${num} echo "" >&6 } & } done wait # 关闭fd6管道 exec 6>&- b=$(date +%H%M%S) echo -e "startTime: $a" echo -e "endTime: $b"