Bash
我如何並行執行這個嵌套的 for 循環?
#!/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 中執行。
如果我理解正確,您應該反轉兩個循環,並將等待放在
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
,然後等待這六個完成。