#!/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
Eu quero que este código comece com comandos de eco para cada IP ao TARGETS
executá-los em paralelo. Ao mesmo tempo, o script não deve prosseguir com comandos de eco para mais de um endereço myIPs
simultaneamente, por isso introduzi wait
no loop interno. Eu quero ter pares de echo
(cada um para a porta 80
e 443
) executados em paralelo para cada destino no TARGETS
. Em outras palavras, eu quero fazer isso (mas infelizmente não funciona):
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
No entanto, porque aumentaria muito minhas médias de carga, não quero isso: :
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
Como posso atingir meu objetivo?
PS Este é apenas um trecho de um script mais complexo. Eu queria isolar o problema relevante, daí o uso de echo
em vez de um dos comandos de rede.
Se bem entendi, você deve inverter os dois loops, e colocar a espera entre os
done
s. CurtiPara cada IP em
myIPs
, ele enviaria um pacote de duas portas para cada uma das trêsTARGETS
e esperaria que essas seis terminassem.Acho sua pergunta difícil de entender: você parece querer execução paralela e sequencial.
Queres isto?
o loop for de cada destino é executado em um subshell em segundo plano.