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?

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

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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.