Bash

我如何並行執行這個嵌套的 for 循環?

  • May 27, 2022
#!/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而不是網路命令之一。

我發現您的問題很難理解:您似乎既想要並行執行又想要順序執行。

你想要這個嗎?

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 中執行。

如果我理解正確,您應該反轉兩個循環,並將等待放在dones. 喜歡

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,然後等待這六個完成。

引用自:https://unix.stackexchange.com/questions/704056