私はこれを何度も行ってきましたが、通常は自分のスクリプトをロールして、ジョブ制御でジョブを実行します。一般的に、ファイルで実行するすべてのスクリプトの名前がある場合、ソリューションは次のようになります。
#!/bin/bash
scripts=$(cat scriptfiles.txt)
declare -i NUM=0
declare -i MAX_PROCS=30
for script in "$scripts"
do
NUM=$((NUM+1))
ssh remote.host.ip "${script}" > ${script}.log 2>&1 &
if [ $NUM -ge $MAX_PROCS ];then
echo "Waiting for $NUM processes to finish."
wait
NUM=0
fi
done
echo "Waiting for final $NUM processes to finish."
wait
exit
それはブルートフォースですが、効果的です。さらに、システムにパラレルなどの追加ソフトウェアを追加する必要はありません。
大きな問題は、最も遅いスクリプトが終了するまでwaitコマンドが待機するため、時間を浪費する可能性があることです。この状況を処理するスクリプトを作成しましたが、想像できるほど複雑になります。すべてのスクリプトがほぼ同じ時間で実行される場合、これはうまく機能します。
別の問題は、最高のパフォーマンスを決定するためにMAX_PROCSを調整する必要がある場合があることです。
もちろん、ssh接続の数は扱いにくい場合があります。この場合、このスクリプトをリモートホストに移動し、「ssh ...」行を変更してスクリプトを直接実行するだけです。