2010-07-23 5 views
11

Ich versuche, XARGS in einem Shell-Skript zu verwenden, um parallele Instanzen einer Funktion auszuführen, die ich im selben Skript definiert habe. Die Funktion beschleunigt das Abrufen einer Seite, und deshalb ist es wichtig, dass die Seiten gleichzeitig in parallelen Prozessen und nicht in Hintergrundprozessen abgerufen werden (wenn mein Verständnis davon falsch ist und der Unterschied zwischen den beiden gering ist, lassen Sie es mich wissen) .Shell Scripting: Verwenden von Xargs zum Ausführen paralleler Instanzen einer Shell-Funktion

Die Funktion ist:

function time_a_url() 
{ 
    oneurltime=$($time_command -p wget -p $1 -O /dev/null 2>&1 1>/dev/null | grep real | cut -d" " -f2) 
    echo "Fetching $1 took $oneurltime seconds." 
} 

Wie man dies in einer Form mit einem xargs Rohr macht, die Anzahl, wie oft nehmen time_a_url parallel als Argument zu laufen? Und ja, ich weiß über GNU parallel, ich habe einfach nicht das Privileg, Software zu installieren, wo ich dies schreibe.

Antwort

11

Hier ist eine Demo, wie Sie Ihre Funktion erhalten möglicherweise in der Lage zu arbeiten:

$ f() { echo "[[email protected]]"; } 
$ export -f f 
$ echo -e "b 1\nc 2\nd 3 4" | xargs -P 0 -n 1 -I{} bash -c f\ \{\} 
[b 1] 
[d 3 4] 
[c 2] 

die Schlüssel zu machen, diese Arbeit zu export die Funktion so die bash dass xargs laicht es sehen und zu entkommen das Leerzeichen zwischen dem Funktionsnamen und den Escape-Klammern. Sie sollten in der Lage sein, dies an Ihre Situation anzupassen. Sie müssen die Argumente für -P und -n (oder entfernen Sie sie) an Ihre Bedürfnisse anpassen.

können Sie wahrscheinlich die von grep und cut loszuwerden. Wenn Sie die eingebaute Bash time verwenden, können Sie ein Ausgabeformat mit der Variablen TIMEFORMAT angeben. Wenn Sie GNU verwenden /usr/bin/time, können Sie das --format Argument verwenden. Jede dieser ermöglicht es Ihnen, die -p auch fallen zu lassen.

Sie können diesen Teil Ihres Befehls wget ersetzen: 2>&1 1>/dev/null mit -q. In jedem Fall haben Sie diese umgekehrt. Die richtige Reihenfolge >/dev/null 2>&1 wäre.

+1

habe ich 'xargs -P0 -n1 -I {} bash -c "f {}"', das noch funktioniert, und scheint ein etwas aufgeräumter. –

0

Wenn Sie GNU Parallel auf einem anderen System installieren, sehen Sie, dass die Funktionalität in einer einzigen Datei (parallel genannt) ist.

Sie sollten einfach in der Lage sein, zu kopieren, die Datei auf Ihren eigenen ~/ist.

1

Unter Mac OS X:

xargs: max. Prozesse müssen> 0 sein (für: xargs -P [> 0])

f() { echo "[[email protected]]"; } 
export -f f 

echo -e "b 1\nc 2\nd 3 4" | sed 's/ /\\ /g' | xargs -P 10 -n 1 -I{} bash -c f\ \{\} 

echo -e "b 1\nc 2\nd 3 4" | xargs -P 10 -I '{}' bash -c 'f "[email protected]"' arg0 '{}'