Verfolgen Sie den Fortschritt mit xargs

11

Ich verwende xargs, um einen Befehl für eine Reihe von Eingabeparametern wie folgt auszuführen:

cat <someinput> | xargs -n 1 -P 5 <somecmd>

Die Eingabedatei ist sehr lang und die Ausführung dauert lange. Ich warte nur darauf, dass die Eingabeaufforderung angezeigt wird. Gibt es eine Möglichkeit, einen Fortschrittsbalken für die Anzahl der abgeschlossenen Eingabeargumente anzuzeigen?

Ich habe versucht, 'bar' zu verwenden, aber ich habe immer einen 'unendlichen' Durchsatz erhalten. Es scheint, als würde xargs die gesamte Eingabe lesen, bevor Befehle ausgeführt werden.

http://i.stack.imgur.com/5Wsgx.gif

Utkarsh Sinha
quelle

Antworten:

13

Wenn Sie GNU Parallel haben, können Sie Folgendes ausführen:

cat <someinput> | parallel --bar -P 5 <somecmd>

GNU Parallel ist ein allgemeiner Parallelisierer und erleichtert das parallele Ausführen von Jobs auf demselben Computer oder auf mehreren Computern, auf die Sie SSH-Zugriff haben.

Wenn Sie 32 verschiedene Jobs haben, die Sie auf 4 CPUs ausführen möchten, besteht eine einfache Möglichkeit zur Parallelisierung darin, 8 Jobs auf jeder CPU auszuführen:

Einfache Planung

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

GNU Parallele Planung

Installation

Für eine persönliche Installation ist kein Root-Zugriff erforderlich. Dies kann in 10 Sekunden erfolgen:

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

Weitere Installationsoptionen finden Sie unter http://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 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

Ole Tange
quelle
1
Vielen Dank (für die Antwort und für das Schreiben der Software!), es funktioniert großartig!
Greg Sadetsky
9

Sie können pv verwenden:

cat <someinput> | pv -p -s sizeof_someimput | xargs -n 1 -P 5 <somecmd>

Damit wissen Sie, wo sich das Lesen eines Imputs befindet, sodass Sie ungefähr wissen, wo sich die Behandlung eines Imputs befindet.

DrGkill
quelle
1
Ein weiterer häufiger Anwendungsfall könnte die Kombination mit find sein:FIND=( find "$DIR" -type f ) && ${FIND[@]} -print0 | pv -0lps $(${FIND[@]} | wc -l) | xargs -0 -I {} -P 5 <somecmd>
mxmlnkn
3

Wenn Sie nur nach einem allgemeinen Hinweis auf den Fortschritt suchen, ist es am einfachsten, vor dem Ausführen des gewünschten Befehls nur ein Echo zu senden.

Beispiel: cat <someinput> | xargs -I{} sh -c 'echo {}; <somecmd>;'

-I{}wird {}auf die aktuell verarbeitete Zeichenfolge gesetzt

sh -cMit dieser Option können Sie mehrere Befehle ausführen (Hinweis: Semikolon, nachdem jeder Befehl erforderlich ist, einschließlich des letzten .

Zaheer
quelle