Bash

bash 並行程序是否已經關閉了系統?

  • July 31, 2019

我有一個遠端控制伺服器,我用它來自動對我的所有節點連續執行命令/腳本等。為了提高性能和速度,我想並行執行它。我正在大約 180 個節點中執行命令。在系列中,我需要大約 2 個小時才能完成所有這些操作。所以我現在正在尋找速度。虛擬碼如下所示,我使用 based64 將命令發送到其他節點。我可以使用它執行任意複雜的命令。

for host in ${sshconfig[@]}; do
ssh "$host" "echo $COMMAND | base64 -d | bash" &
done

但是我犯了一個錯誤,忘記有很多節點,所以我的bash腳本為每個節點創建了很多程序,結果控制伺服器的系統崩潰了,它已經關閉了。現在我無法再連接到它了。

我想知道,如何在 bash 腳本中分配記憶體?的易用性ssh使 bash 非常適合我的情況,但我想知道如何通過並行執行它們來提高性能並且仍然不用擔心系統崩潰等。

要限制並行 SSH 連接的數量,您可以這樣使用xargs

printf '%s\n' "${sshconfig[@]}" |
xargs -P 4 -I {} ssh "{}" "echo $COMMAND | base64 -d | bash"

這將在最多四個並行實例中執行您的命令(由 給出-P 4)。該-I {}選項會將命令中的字元串xargs替換為從其標準輸入中讀取的字元串。{}標準輸入連接到它,它只列印當時列表中的printf一項。sshconfig

您將使用各種-P設置測試執行它,直到您找到一個似乎執行良好的數字。

如果您在遠端機器上的登錄 shell 是bash,您也可以考慮

code=$( base64 -d <<<"$COMMAND" )

printf '%s\n' "${sshconfig[@]}" |
xargs -P 4 -I {} ssh "{}" "$code"

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