wake-up-neo.net

Programme mit xargs parallel ausführen

Ich habe derzeit das aktuelle Skript.

#!/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

Dies wird jedoch jeweils nur einmal ausgeführt. Auch mit -n8 kein Glück. Wenn Sie & am Ende der Zeile hinzufügen, die in der script for-Schleife ausgeführt werden soll, wird versucht, das Skript 99 Mal gleichzeitig auszuführen. Wie führe ich die Schleife nur 8 auf einmal aus, insgesamt bis zu 100.

62
Olivier

Auf der Manpage xargs:

Diese Handbuchseite dokumentiert die GNU= Version von xargs. Xargs liest Elemente aus der Standardeingabe, die durch Leerzeichen (die mit doppelten oder einfachen Anführungszeichen oder einem Backslash geschützt werden können) oder Zeilenumbrüche begrenzt sind, und führt das aus Befehl (Standard ist/bin/echo) einmal oder mehrmals mit Initialisierungsargumenten gefolgt von Elementen, die aus der Standardeingabe gelesen wurden. Leerzeilen in der Standardeingabe werden ignoriert.

Das bedeutet, dass xargs für Ihr Beispiel wartet und die gesamte Ausgabe Ihres Skripts sammelt und dann echo <that output> Ausführt. Nicht genau das, was Sie brauchten oder wollten.

Das Argument -n Gibt an, wie viele Elemente aus der Eingabe für jeden ausgeführten Befehl verwendet werden sollen (nichts für sich, über Parallelität hier).

Um mit xargs das zu tun, was Sie wollen, müssten Sie etwas Ähnliches tun (ungetestet):

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

Was so zusammenbricht.

  • printf %s\\n {0..99} - Drucken Sie eine Zahl pro Zeile von 0 Bis 99.
  • Führen Sie xargs Aus
    • einnehmen von höchstens einem Argument pro ausgeführter Befehlszeile
    • und führen Sie bis z acht Prozesse gleichzeitig aus
92
Etan Reisner

Mit GNU Parallel würden Sie Folgendes tun:

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

Hinzufügen in -P8 Wenn Sie nicht einen Job pro CPU-Kern ausführen möchten.

Im Gegensatz zu xargs wird The Right Thing ausgeführt, auch wenn die Eingabe Leerzeichen (') oder "(hier jedoch nicht) enthält. Außerdem wird sichergestellt, dass die Ausgabe von verschiedenen Jobs nicht miteinander gemischt wird Wenn Sie die Ausgabe verwenden, erhalten Sie garantiert keine halbe Linie aus zwei verschiedenen Jobs.

GNU Parallel ist ein allgemeiner Parallelisierer, mit dem Sie auf einfache Weise Jobs auf demselben Computer oder auf mehreren Computern, auf die Sie ssh-Zugriff haben, parallel ausführen können.

Wenn Sie 32 verschiedene Jobs auf 4 CPUs ausführen möchten, können Sie auf einfache Weise 8 Jobs auf jeder CPU parallelisieren:

Simple scheduling

GNU Parallel erzeugt stattdessen einen neuen Prozess, wenn man fertig ist - die CPUs aktiv zu halten und damit Zeit zu sparen:

GNU Parallel scheduling

Installation

Wenn GNU Parallel nicht für Ihre Distribution gepackt ist, können Sie eine persönliche Installation durchführen, für die kein Root-Zugriff erforderlich ist. Dies kann in 10 Sekunden geschehen:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 3374ec53bacb199b245af2dda86df6c9
12345678 3374ec53 bacb199b 245af2dd a86df6c9
$ md5sum install.sh | grep 029a9ac06e8b5bc6052eac57b2c3c9ca
029a9ac0 6e8b5bc6 052eac57 b2c3c9ca
$ sha512sum install.sh | grep f517006d9897747bed8a4694b1acba1b
40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4
60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb
$ bash install.sh

Weitere Installationsoptionen finden Sie unter http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Weitere Informationen

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

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

Gehen Sie durch das Tutorial: http://www.gnu.org/software/parallel/parallel_tutorial.html

Melden Sie sich für die E-Mail-Liste an, um Unterstützung zu erhalten: https://lists.gnu.org/mailman/listinfo/parallel

54
Ole Tange