Bash-Skript zum Verarbeiten von Dateien mit mehreren Prozessen

1

Die meisten Bash-Skripte für die Batch-Dateiverarbeitung könnten beschleunigt werden, indem mehrere Prozesse gestartet werden, um alle Kerne zu nutzen. Ich möchte ein Skript erstellen, das eine Reihe von Dateien verarbeitet und die Anzahl der zu verarbeitenden Dateien gleichmäßig auf die Prozesse verteilt. Wie mache ich das?

sudo
quelle

Antworten:

4

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

Felipe Lema
quelle
GNU Parallel scheint auf vielen Unix-Systemen (einschließlich OS X und Ubuntu Server) nicht vorinstalliert zu sein, aber es ist viel angenehmer als die andere Methode, wenn Sie die Möglichkeit haben, es zu installieren. Danke für den Tipp.
Sudo
1

Ich weiß nicht, ob dies der schönste Weg ist, aber hier ist, worauf ich gekommen bin.

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 erzeugt n Prozesse, die jeweils eine Datei verarbeiten und dann (n - 1) Dateien überspringen. Process (i mod n) verarbeitet die i-te Datei.

sudo
quelle