以ping进程为例

法1.使用进程搜索(如pgrep)获取进程数,根据已有进程数控制是否继续生成进程。

for i in {1..100}

do

ping 192.168.88.$i

while :

do

      x=$(pgrep ping|wc -l)

      [ $x -lt 5 ] && break

      sleep 0.2

done

done

#当ping任务数大于等于5时休息0.2s


法2.使用命名管道的特性,控制进程产生

#控制思路: 预先在命名管道中填五行字符 ,绑定文件名描述符 ,再使用循环读取。当read能读到东西,继续执行后面的任务,读不到的时候就卡住不再执行后续任务直到再读取到东西。

#创建命名管道abcd并绑定文件名描述符

mkfifo abcd

exec 8<> abcd

#默认写入与读取命名管道都会卡住

#使用exec 8<> abcd 将命名管道abcd与文件名描述符8绑定后,写入不会卡住,读取不到才会卡住

#read -u8 读取8号文件,一次只读一行 ,而cat 8 会一直读取

echo ... >> abcd

#填充命名管道,有几行则允许同时存在几个该进程

for i in {1..100}

do

read -u8

{ ping 192.168.88.$i

echo "" >> abcd

}& 

done

#{}&将两个任务前后放进后台,只有ping结束之后才轮到echo