#!/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
Verwenden Sie immer Arbeiter, wenn Sie eine parametrisierte Anzahl von Prozessen erzeugen, und begrenzen Sie die maximale Anzahl von Arbeitern, die erzeugen können .
xargs -n | while read
ist ein einfaches Mittel zum Iterieren von Listen in Stapeln.
seq
Erstellt eine Liste mit Zahlen von 1 bis N.
xargs -n
unterteilt diese Liste in N / Arbeiter + 1 Chargen.
- Beispiel: N = 100 Arbeiter = 10 erzeugen 10 Zeilen mit bis zu 11 Zahlen von 1 bis 100.
while read i
liest jede Zahlenzeile.
work ${i} &
Ruft einfach die work
Funktion mit einem ${i}
Stapel von Zahlen auf.
Zum Debuggen habe ich auskommentierten Debug-Code hinzugefügt. Ersetzen Sie einfach echo
die Debug-Version und den Code dazwischen # --
durch die Debug-Version, und Sie können sehen, wie es bei Batches funktioniert. Kommentar set -x
für eine detailliertere Debug-Ausgabe, die Sie möglicherweise in eine Datei umleiten möchten.
Führen Sie einfach die Debug-Version mit verschiedenen Parametern aus, um zu sehen, wie sie funktioniert:
parallel.sh 223 5 1
parallel.sh 223 5 5
parallel.sh 223 5 10
parallel.sh 223 5 20
Haftungsausschluss: Dieser Code synchronisiert den min
Wert zwischen Arbeitsprozessen nicht. Das Erreichen des Mindestwerts ist keine schreckliche Übung. Dies wird wahrscheinlich tun:
parallel.sh 223 5 20 | tr ' ' '\n' | sort -n | head -1
Oder fügen Sie dem Skript selbst dasselbe hinzu:
echo ${arr[*]} | tr ' ' '\n' | sort -n | head -1