Bashシステムの並列プロセスは終了しましたか?

Bashシステムの並列プロセスは終了しましたか?

すべてのノードで連続的にコマンド/スクリプトなどを自動的に実行するリモートコントロールサーバーがあります。パフォーマンスとスピードを向上させるために並列に実行したいと思います。約180ノードでコマンドを実行しています。シリーズではすべて完了するのに約2時間かかりました。だから今はスピードを探しています。擬似コードは以下の通りです。私はbased64を使用して別のノードにコマンドを送信します。任意に複雑なコマンドを実行するために使用できます。

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

しかし、私が間違えてノードがたくさんあるのを忘れてしまったので、私のbashスクリプトは各ノードに多くのプロセスを作成し、その結果サーバーを制御するシステムがダウンして終了しました。これで接続できなくなりました。

bashスクリプトからメモリを割り当てる方法を知りたいです。使いやすいので、sshbashは私の状況には最適ですが、システムのクラッシュなどを心配することなく、並列に実行してパフォーマンスを向上させる方法を知りたいです。

ベストアンサー1

パラレルSSH接続の数を制限するには、次のものを使用できますxargs

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

-P 4これにより、最大4つの並列インスタンスでコマンド(提供)が実行されます。この-I {}オプションは、コマンドの文字列をxargs標準入力から読み取った文字列に置き換えます。{}に接続されている標準入力は、printfその時点でリストから1つの項目のみを印刷します。sshconfig

-Pうまく動作するような数字が見つかるまで、さまざまな設定でテストを実行してみることができます。

リモートシステムのログインシェルがある場合は、次のこともbash考慮できます。

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

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

おすすめ記事