2015-02-06 5 views
36

Ich habe derzeit das aktuelle Skript.Programme parallel mit XARGs laufen

#!/bin/bash 
# script.sh 

for i in {0..99}; do 
    script-to-run.sh input/ output/ $i 
done 

Ich möchte es parallel mit XARGs ausführen. Ich habe versucht

script.sh | xargs -P8 

Aber die oben genannten nur einmal zu der Zeit ausgeführt. Kein Glück mit -n8. Das Hinzufügen von & am Ende der Zeile, die im Skript für die Schleife ausgeführt werden soll, würde versuchen, das Skript 99 Mal auf einmal auszuführen. Wie führe ich die Schleife nur 8 zu der Zeit aus, bis zu 100 insgesamt.

+4

Verwenden GNU Parallel – Barmar

+0

Das ist, was ich ursprünglich machen wollte, musste aber xargs greifen, weil ich unter Windows bin. Ich konnte GNU Parallel unter Windows nicht starten. – Olivier

+0

Ruft das Skript sich selbst an oder haben Sie einfach die Namen verwechselt, als Sie hier gefragt haben? –

Antwort

50

Vom xargs Manpage:

Diese Manual-Seite dokumentiert die GNU-Version von xargs. xargs liest Elemente aus der Standardeingabe, begrenzt durch Leerzeichen (die mit mit doppelten oder einfachen Anführungszeichen oder einem umgekehrten Schrägstrich geschützt werden können) oder Zeilenumbrüche, und führt den Befehl einmal/mehrmals mit beliebigem Initial aus - Argumente gefolgt von Elementen, die von der Standardeingabe gelesen werden. Leerzeilen auf der Standardeingabe werden ignoriert.

was bedeutet, dass für Ihr Beispiel xargs warten und die gesamte Ausgabe von Ihrem Skript zu sammeln und dann echo <that output> läuft. Nicht genau das alles, was nützlich ist oder was du wolltest.

Das Argument -n ist, wie viele Elemente aus der Eingabe mit jedem Befehl verwendet werden (nichts, allein, über Parallelität hier).

zu tun, was Sie wollen mit xargs Sie etwas tun müssten, um ähnliche Produkte (ungetestet):

printf %s\\n {0..99} | xargs -n 1 -P 8 script-to-run.sh input/ output/ 

, die wie folgt zusammenbricht.

  • printf %s\\n {0..99} - Druck eine Nummer pro-Linie von 0 zu 99.
  • Run xargs
    • Einnahme höchstens ein Argument pro Lauf Kommandozeile
    • und laufen bis zu acht Prozesse zu einem Zeitpunkt
+3

Eigentlich müssen Sie die Argumente nicht in separate Zeilen schreiben; Xargs Wort-Splits. Also würde 'echo {0..99} |' genauso gut funktionieren. '<<< {0..99}' scheint nicht zu funktionieren; obwohl '<<< Wort' als Klammer-expandierendes Wort dokumentiert ist, tut es dies nicht mit irgendeiner Version von Bash, die ich praktisch habe. – rici

+1

@rici Sieht dann wie ein Dokumentationsfehler aus, besonders da die Dokumentation für Here Documents * keine Klammerextension erwähnt (und es dort auch nicht in einem Schnelltest vorkommt), obwohl sie auch keine Tilde-Erweiterung erwähnt (was nicht funktioniert) Es passiert nicht für '<<' aber tut für '<<<' so '* shrug *'). Die Erweiterungen, die in den hier vorliegenden Dokumenten und Strings vorkommen und nicht passieren, sind für mich etwas merkwürdig. –

+0

Wie können Sie Ergebnisse von verschiedenen Läufen mit z. Zeilenumbrüche? –

35

Mit GNU Parallel würden Sie tun:

parallel script-to-run.sh input/ output/ {} ::: {0..99} 

Fügen Sie -P8 hinzu, wenn Sie nicht möchten, einen Auftrag pro CPU-Kern auszuführen.

Gegenüber xargs wird es die richtige Sache tun, auch wenn die Eingabe Leerzeichen, ', oder "(nicht der Fall hier, obwohl). Es stellt auch sicher, dass die Ausgabe von verschiedenen Jobs nicht zusammen gemischt werden, also wenn Sie Nutzen Sie die Ausgabe, so dass Sie garantiert keine halbe Zeile aus zwei verschiedenen Jobs bekommen.

GNU Parallel ist ein allgemeiner Parallelizer und ermöglicht die parallele Ausführung von Jobs auf demselben Rechner oder auf mehreren Rechnern, auf die Sie ssh zugreifen können.

Wenn Sie 32 verschiedene Jobs haben Sie auf 4 CPUs ausgeführt werden soll, ein straight forward Weg parallelisieren auf jeder CPU laufen 8 Jobs:

Simple scheduling

GNU Parallel laicht stattdessen einen neuen Prozess, wenn ein Oberflächen - halten die CPUs aktiv und damit Zeit zu sparen:

GNU Parallel scheduling

Installations

Wenn GNU Parallel nicht für Ihre Distribution verfügbar ist, können Sie eine persönliche Installation durchführen, die keinen Root-Zugriff erfordert. Sie kann, indem Sie diese in 10 Sekunden durchgeführt werden:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

Für andere Installationsoptionen siehe http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Weitere

weitere Beispiele siehe: http://www.gnu.org/software/parallel/man.html

Beobachten Sie die Intro-Videos: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Spaziergang durch die Tut orial: http://www.gnu.org/software/parallel/parallel_tutorial.html

Zeichen für die E-Mail-Liste nach oben Unterstützung erhalten: https://lists.gnu.org/mailman/listinfo/parallel

+8

Dies beantwortet nicht die Frage, noch weisen Sie darauf hin, warum XARGS nicht dasselbe erreichen können. –

+2

downvote weil xarg für mich genau so funktioniert, wie das zweite Bild zeigt. – noonex

+0

@noonex Wissen Sie, dass nicht jeder die von Ihnen verwendete Version von xargs verwendet und dass -P nicht in allen Versionen von xargs enthalten ist? –