Siehe GNU parallel, um Unterprozesse parallel zu starten. Hat eine ähnliche Syntax wie xargs. Aus den Dokumenten :
So komprimieren Sie alle HTML-Dateien mit gzip run:
find . -name '*.html' | parallel gzip --best
Die meisten Bash-Skripte für die Batch-Dateibearbeitung können beschleunigt werden, indem mehrere Prozesse gestartet werden, um alle Kerne zu nutzen. Ich möchte ein Skript erstellen, das eine Reihe von Dateien verarbeitet, wobei die Anzahl der zu bearbeitenden Dateien gleichmäßig auf die Prozesse aufgeteilt wird. Wie mache ich das?
Siehe GNU parallel, um Unterprozesse parallel zu starten. Hat eine ähnliche Syntax wie xargs. Aus den Dokumenten :
So komprimieren Sie alle HTML-Dateien mit gzip run:
find . -name '*.html' | parallel gzip --best
Ich weiß nicht, ob dies der schönste Weg ist, aber ich habe es mir ausgedacht.
Verwendungszweck: batch.sh [number of processes to use]
batch.sh:
end=$(( $1 - 1 )) for i in `seq 0 $end`; do echo Spawning helper $i of $end ./helper.sh $i $1 & done
helper.sh:
n=$1 for file in ./*; do # Your code here v echo Processing file: $file # ^ n=$((n+1)) n=$((n%$2)) done
Dies führt zu n Prozessen, bei denen jeder eine Datei verarbeitet und dann (n - 1) Dateien überspringt. Process (i mod n) verarbeitet die i-te Datei.