#!/usr/bin/bash
TARGETS=(
"81.176.235.2"
"81.176.70.2"
"78.41.109.7"
)
myIPs=(
"185.164.100.1"
"185.164.100.2"
"185.164.100.3"
"185.164.100.4"
"185.164.100.5"
)
for t in "${TARGETS[@]}"
do
for a in "${myIPs[@]}"
do
echo "${a} ${t} -p 80" >>log 2>&1 &
echo "${a} ${t} -p 443" >>log 2>&1 &
wait
done
done
我希望这段代码从每个 IP 的 echo 命令开始,TARGETS
以并行执行它们。同时,该脚本并不意味着同时对多个地址执行回显命令myIPs
,因此我wait
在内部循环中进行了介绍。我想为echo
每个目标在. 换句话说,我想做到这一点(但遗憾的是它不起作用):80
443
TARGETS
for t in "${TARGETS[@]}"
do &
for a in "${myIPs[@]}"
do
echo "${a} ${t} -p 80" >>log 2>&1 &
echo "${a} ${t} -p 443" >>log 2>&1 &
wait
done
done
wait
然而,因为它会增加我的平均负载太多,我不想要这个::
for t in "${TARGETS[@]}"
do
for a in "${myIPs[@]}"
do
echo "${a} ${t} -p 80" >>log 2>&1 &
echo "${a} ${t} -p 443" >>log 2>&1 &
done
done
wait
我怎样才能实现我的目标?
PS 这只是一个更复杂的脚本的片段。我想隔离相关问题,因此使用echo
而不是网络命令之一。
如果我理解正确,您应该反转两个循环,并将等待放在
done
s. 喜欢对于 中的每个 IP
myIPs
,它会向三个中的每一个发送一个包含两个端口的数据包TARGETS
,然后等待这六个完成。我发现您的问题很难理解:您似乎既想要并行执行又想要顺序执行。
你想要这个吗?
每个目标的 for 循环都在后台的子 shell 中运行。