以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