リモート マシンが 1000 台あります。それらすべてで特定のコマンドを並列に実行したいと考えています。私は、順番に実行する以下のコマンドを使用します。
for f in `cat host.lst`
do
./runScript.sh $f
done
100 台のホストがあると仮定します。100台のホストで並列にhost.lst
実行したいと考えています。また、ログを維持する必要があります。runScript.sh
私のマシンには などのユーティリティをインストールできませんPSSH
。
いろいろ調べて、以下のリンクを見つけましたが、役に立ちませんでした。どのように機能するのかわかりません。
パターンに一致する複数のファイルに対してコマンドを並列に実行する
誰かその論理を説明できますか?
答え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.sh
とssh
同時に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
。
重要な変更点は、 の追加です&
。これにより、次のコマンドを実行する前にプロセスの完了を待つのではなく、バックグラウンドでプロセスが実行されます。