シェル スクリプトを使用して複数のサーバーでコマンドを並列に実行する

シェル スクリプトを使用して複数のサーバーでコマンドを並列に実行する

リモート マシンが 1000 台あります。それらすべてで特定のコマンドを並列に実行したいと考えています。私は、順番に実行する以下のコマンドを使用します。

for f in `cat host.lst`
do
       ./runScript.sh $f
done

100 台のホストがあると仮定します。100台のホストで並列にhost.lst実行したいと考えています。また、ログを維持する必要があります。runScript.sh

私のマシンには などのユーティリティをインストールできませんPSSH

いろいろ調べて、以下のリンクを見つけましたが、役に立ちませんでした。どのように機能するのかわかりません。

多数のサーバーでSSH経由でコマンドを自動的に実行する

パターンに一致する複数のファイルに対してコマンドを並列に実行する

誰かその論理を説明できますか?

答え1

logdir=`mktemp -d`
bunch=200

IFS=$'\n'
for hosts in $(< hosts.lst xargs -r -L "$bunch"); do
   IFS=" ";
   for host in $hosts; do
      ssh -n -o BatchMode=yes "$host" './runScript.sh' 1>"$logdir/$host.log" 2>&1 &
   done
   wait
done

ファイルに 1 行に 1000 台 (数千台) のホストがリストされhosts.lst、その中から一度に 1 組 (200 台) が選択され、これら 200 台のホストのそれぞれで が生成されるrunScript.shssh同時にbatch mode、これらのバックグラウンド ジョブのそれぞれからの出力がディレクトリ 内のstdout+stderrという名前のファイルに保存され、必要に応じて調べられると仮定します。host$logdir

wait最後に、内部ループの最後にあるコマンドを使用して、1 つのバッチが終了するまで待機してから次のバッチを起動しますfor

答え2

他のユーティリティを必要としないスクリプトへの次の変更は並列で実行されますが、ホストのオープン ファイル ハンドルの制限によっては制限に達する可能性があります。

for f in $(cat host.lst); do
       ./runScript.sh $f &
done

結果をログに記録するには、 の> run.log後にを追加してdone新しいファイルに保存しますrun.log

重要な変更点は、 の追加です&。これにより、次のコマンドを実行する前にプロセスの完了を待つのではなく、バックグラウンドでプロセスが実行されます。

関連情報