#!/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
执行它们。同时,该脚本并不意味着同时对多个地址执行 echo 命令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
而不是网络命令之一。
答案1
我发现你的问题很难理解:你似乎想要并行执行和顺序执行。
你想要这个吗?
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
每个目标的 for 循环都在后台的子 shell 中运行。
答案2
如果我理解正确的话,你应该颠倒两个循环,并将等待放在done
s 之间。喜欢
for a in "${myIPs[@]}"
do for t in "${TARGETS[@]}"
do echo "${a} ${t} -p 80" 2>&1 &
echo "${a} ${t} -p 443" 2>&1 &
done
wait
done
对于 中的每个 IP myIPs
,它将向这三个端口中的每一个发送一个包含两个端口的数据包TARGETS
,然后等待这六个端口完成。