mehrere Befehle gleichzeitig ausführen

mehrere Befehle gleichzeitig ausführen

Ich muss viele ähnliche Befehle in möglichst kurzer Zeit und unter Verwendung aller verfügbaren Ressourcen ausführen.

In meinem Fall verarbeite ich beispielsweise Bilder, wenn ich den folgenden Befehl verwende: for INPUT in *.jpg do; some_command; doneDer Befehl wird einzeln ausgeführt und verwendet nicht alle verfügbaren Ressourcen.

Andererseits for INPUT in *.jpg do; some_command &; doneführt die Ausführung jedoch dazu, dass der Maschine innerhalb kürzester Zeit die Ressourcen ausgehen.

Ich kenne atden batchBefehl, bin mir aber nicht sicher, ob ich ihn in meinem Fall verwenden kann. Korrigieren Sie mich, wenn ich falsch liege.

Ich habe also darüber nachgedacht, die Befehle in eine Art Warteschlange zu stellen und nur einen Teil davon auf einmal auszuführen. Ich weiß nicht, wie ich das schnell machen soll, und das ist das Problem. Ich bin sicher, dass jemand schon einmal auf ein ähnliches Problem gestoßen ist.

Bitte beraten.

Antwort1

GNU Parallel ist genau dafür gemacht:

parallel some_command {} ::: *.jpg

Standardmäßig ist ein Job pro CPU-Kern verfügbar. In Ihrem Fall möchten Sie möglicherweise einen Job mehr ausführen, als Sie Kerne haben:

parallel -j+1 some_command {} ::: *.jpg

GNU Parallel ist ein allgemeiner Parallelisierer und erleichtert die parallele Ausführung von Jobs auf derselben Maschine oder auf mehreren Maschinen, auf die Sie per SSH-Zugriff zugreifen können.

Wenn Sie 32 verschiedene Jobs haben, die Sie auf 4 CPUs ausführen möchten, können Sie die Parallelisierung ganz einfach durchführen, indem Sie auf jeder CPU 8 Jobs ausführen:

Einfache Terminplanung

GNU Parallel startet stattdessen einen neuen Prozess, wenn einer fertig ist – wodurch die CPUs aktiv bleiben und Zeit gespart wird:

GNU Parallel-Planung

Installation

Aus Sicherheitsgründen sollten Sie GNU Parallel mit Ihrem Paketmanager installieren. Wenn GNU Parallel jedoch 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 ist in 10 Sekunden erledigt, indem Sie Folgendes tun:

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

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

Erfahren Sie mehr

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

Sehen Sie sich die Einführungsvideos an:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Gehen Sie das Tutorial durch: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

Antwort2

Sie können GNU make mit der --jobsOption verwenden, Dinge parallel auszuführen, jedoch auf die angegebene Anzahl von Jobs beschränkt. Sie können diese Zahl so anpassen, dass Ihr Rechner nicht kaputtgeht.

Hier ist ein Beispiel für ein Makefile, das Ziele verwendet (das könnten beispielsweise Ihre Ausgabedateien sein) und für jedes Ziel einen (Dummy-)Befehlssatz ausführt:

all: a b c d e f g h

a b c d e f g h:
    echo $@; sleep 10

NB Die Einrückung des Befehlsmussein TAB-Zeichen sein. Siehe dieGNU make-Dokumentationfür Details zur Syntax von Makefiles.

Sie können make aufrufen make --jobs 4und erhalten die folgende Ausgabe (ich habe die time make --jobs 4folgende verwendet, um die verstrichene Zeit anzuzeigen):

echo a; sleep 10
echo b; sleep 10
echo c; sleep 10
echo d; sleep 10
b
a
c
d
echo e; sleep 10
echo f; sleep 10
echo g; sleep 10
e
f
echo h; sleep 10
g
h

real    0m20.009s
user    0m0.010s
sys 0m0.011s

Die ersten vier wurden parallel ausgeführt, dann die nächsten vier, sodass die gesamte verstrichene Zeit 20 Sekunden beträgt.

verwandte Informationen