在 Shell 腳本內執行命令的並發實例

在 Shell 腳本內執行命令的並發實例

首先我要說的是,我仍在學習 bash 腳本,而且我不知道很多事情。如果我漏掉了什麼,請隨意罵我。

接下來,我將建立一個簡單的 bash 腳本來執行 ping 到 2 個不同的主機並輸出到檔案。我已經解決了這個問題,並且正在發揮作用。出於好奇,我在腳本中添加了 ping 輸出列印前後的輸出日期,這樣我就知道運行 ping 需要多長時間。我將 ping 設定為 1 秒間隔,10 次 ping,2 個主機。我的第一次約會(很久以前...)的時間戳記是 14:36:20。第二個日期(ping 之後)的時間戳記為 14:36:40。

因此,日期等待兩個 ping 完成。這意味著 ping 是按順序運行的。

我可以讓它們同時運行,這樣我就可以花 10 秒而不是 20 秒來運行腳本嗎?

這是我的腳本片段:

date >> teste.txt
cat hosts.txt |  while read output
do   ping -c 10 -i 1 "$output" >> teste.txt
done
date >> teste.txt

我還希望這個腳本能完成其他幾件事,但我保證只有在無法在 Barsa 上找到滿意的答案時我才會詢問。

PS:hosts.txt 是我儲存要 ping 的主機的位置。

答案1

你的問題的措辭有點難以理解,但我認為你正在尋找類似的東西:

command & 
command &
wait

該腳本將在後台執行這兩個命令並等待回應。

但是,就您而言,您需要小心競爭條件。您可能希望將各個命令的輸出傳送到臨時檔案中,然後將它們放入主檔案中,因此您可能會執行以下操作:

command > "${tmp1}" & 
command > "${tmp2}" & 
wait
cat "${tmp1}" "${tmp2}" >> "${main}"
rm -f "${tmp1}" "${tmp2}"

更新:您可以嘗試 xargs (例如https://stackoverflow.com/questions/15755422/linux-bash-script-to-ping-multiple-hosts-simultaneously

答案2

使用 GNU Parallel,您可以執行以下操作:

date >> teste.txt
cat hosts.txt |  parallel -j0 ping -c 10 -i 1 {} >> teste.txt
date >> teste.txt

相關內容