#!/bin/bash
# set -x # debug version
N=${1:-123}
n=${2:-45}
workers=${workers:-${3:-10}}
((workers < 1)) && ((workers = 1))
((workers > 20)) && ((workers = 20))
((min=100000000000000)) #set min to some garbage value
work() {
for i in ${*}; do
for (( j=1; j<=${n}; j++ )); do
val=$(/path/to/a.out)
val2=$(echo ${val} | bc)
(( val2 < min )) && (( min = val2 ));
done
echo ${min}
# # debug version
# echo ${i} ${j} ${min}
done
}
# --
arr=($(
seq ${N} | xargs -n$[N/workers + 1] | while read i; do
work ${i} &
done
wait
))
echo ${arr[*]}
# --
# # debug version
# seq ${N} | xargs -t -n$[N/workers + 1] | while read i; do
# work ${i} &
# done
# wait
パラメータ化されたプロセス数を生成するときは常にワーカーを使用し、生成できるワーカーの最大数を制限します。
xargs -n | while read
リストをバッチで反復する簡単な方法です。
seq
1からNまでの数値のリストを作成します。
xargs -n
リストをN / workers + 1バッチに分割します。
- たとえば、N = 100ワーカー= 10は、1から100までの11までの数の10行を生成します。
while read i
数値の各行を読み取ります。
work ${i} &
数値のバッチでwork
関数を呼び出すだけ${i}
です。
デバッグするには、コメント化されたデバッグコードを追加しました。をecho
デバッグバージョンに置き換え、コードをデバッグバージョンに置き換える# --
だけで、バッチでの動作を確認できます。set -x
ファイルにリダイレクトしたい場合がある、より詳細なデバッグ出力のコメントを外します。
さまざまなパラメーターを使用してデバッグバージョンを実行し、デバッグ方法を確認します。
parallel.sh 223 5 1
parallel.sh 223 5 5
parallel.sh 223 5 10
parallel.sh 223 5 20
免責事項:このコードはmin
、ワーカープロセス間の値を同期しません。最小値を取得することは恐ろしいことではありません。これはおそらく行うでしょう:
parallel.sh 223 5 20 | tr ' ' '\n' | sort -n | head -1
または、同じものをスクリプト自体に追加します。
echo ${arr[*]} | tr ' ' '\n' | sort -n | head -1