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?
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?
Antworten:
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-parallel
Handbuch ):
parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts
>
mit | tee
zB der erste Befehl wird parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
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 parallel
Befehl zum Aufrufen:
parallel wrapper.sh < live_hosts
Beachten Sie, dass Sie so etwas nicht benötigen cat
, was einen externen Programmaufruf erspart.
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
parallel
erleichtert es jedoch, bestimmte Aspekte zu verwalten; Sie können die Anzahl der parallel laufenden Jobs einfacher begrenzen.
wc -l live_hosts
mehr 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.
tee
mit zu verwenden,parallel
wenn Sie die Ausgabe in setzensortedstuff
? So kann ich die Ausgabe sehen, wie es geht.