Wie würde ich GNU Parallel für diese while-Schleife verwenden?

12

Also habe ich eine while-Schleife:

cat live_hosts | while read host; do \
    sortstuff.sh -a "$host" > sortedstuff-"$host"; done

Dies kann jedoch lange dauern. Wie würde ich GNU Parallel für diese while-Schleife verwenden?

Proletariat
quelle

Antworten:

13

Sie verwenden keine while-Schleife.

parallel "sortstuff.sh -a {} > sortedstuff-{}" <live_hosts

Beachten Sie, dass dies nicht funktioniert, wenn Sie Pfade in Ihrem live_hosts(z. B. /some/dir/file) haben, da dies zu sortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file(resultierend in no such file or directory) expandieren würde . Verwenden Sie in diesen Fällen {//}und {/}( Einzelheiten siehe gnu-parallelHandbuch ):

parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts
don_crissti
quelle
Ist es möglich, teemit zu verwenden, parallelwenn Sie die Ausgabe in setzen sortedstuff? So kann ich die Ausgabe sehen, wie es geht.
Proletariat
1
@Proletariat - Sie möchten auch auf das Terminal ausgeben? Ersetzen Sie einfach >mit | teezB der erste Befehl wird parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
don_crissti
3

Als ein Unix-Typ der alten Schule "mache eine Sache und mache es gut", würde ich das String-Substitutions-Zeug in ein Wrapper-Skript schreiben:

#!/bin/sh
sortstuff.sh -a "$1" > sortedstuff-"$1"

Wenn Sie es aufrufen wrapper.sh, wäre der parallelBefehl zum Aufrufen:

parallel wrapper.sh < live_hosts

Beachten Sie, dass Sie so etwas nicht benötigen cat, was einen externen Programmaufruf erspart.

Warren Young
quelle
2

Dies ist nicht erforderlich parallel , da der Rumpf der Schleife nicht von vorherigen Iterationen abhängt. Starten Sie einfach einen neuen Hintergrundprozess für jeden Host.

while read host; do
    sortstuff.sh -a "$host" > sortedstuff-"$host" &
done < live_hosts
wait    # Optional, to block until the background tasks are done

parallelerleichtert es jedoch, bestimmte Aspekte zu verwalten; Sie können die Anzahl der parallel laufenden Jobs einfacher begrenzen.

chepner
quelle
3
Wenn wc -l live_hostsmehr als die Anzahl der Plattenspindeln oder CPU-Kerne vorhanden ist - je nachdem, ob es sich um eine E / A- oder eine CPU-gebundene Aufgabe handelt -, werden Sie viel von dem Vorteil profitieren, den Sie durch die Parallelität mit einer solchen Lösung erzielen. Die Möglichkeit parallel, die Anzahl der Jobs zu begrenzen, ist nicht nur gut, sondern auch äußerst wichtig, wenn die Verarbeitungsgeschwindigkeit Ihr Ziel ist.
Warren Young