Einfaches Parallelisieren von Shell Befehlen mit xargs!

Wer oft in der Shell arbeitet, stolpert immer mal wieder über Aufgaben, die normal nur sequentiell abgearbeitet werden können.

Beispiele sind z.B. das Durchsuchen von vielen Dateien nach einem Suchmuster oder die Anwendung eines Befehls auf eine Menge an verschiedener Dateien.

Meine Aufgabe war es in allen Dateien meines /usr/local/ nach der ASCII Zeichenkette 'libxml2' zu suchen.

Mein erster Gedanke war, alle Dateien mit find zu listen und dann mit grep nach der Zeichenkette zu suchen.

Daraus ergab sich dann:

find /usr/local -type f -print0 | xargs -0 grep -l 'libxml2'

Erst als ich mit die Parameter zu grep etwas genauer angeschaut habe bin ich dann darauf gestossen, dass in dem Fall find + xargs überhaupt nicht benötigt wird, es geht auch so:

grep -r 'libxml2' -l /usr/local

Aber egal ob mit find oder ohne, dauert es richtig lang auf diese Art die Dateien zu durchsuchen.

Allerdings war mir bei den Parametern von xargs einer ins Auge gefallen, der eine Lösung versprach -P:

Auszug aus man xargs:

-P maxprocs
   Parallel mode: run at most maxprocs invocations of utility at once.

Da ich zuletzt mit pigz, pbzip2 und vor allem mit pthreads experimentiert habe, vermutete ich direkt, dass sich hier eine wunderbare Option verbirgt, die Cores meiner CPU besser zu nutzen!

Es ist auch wirklich so einfach wie es sich anhört. Einfach ein -P 8 mit in das xargs der Kommandozeile und die vormals sequentielle Arbeit wird in 8 Prozessen parallel und damit viel schneller ausgeführt:

find /usr/local -type f -print0 | xargs -0 -P 8 grep -l 'libxml2'

Die Möglichkeiten sind vielfältig und es lässt sich recht einfach in vielen Arten von Batch-Prozessing anwenden!

comments powered by Disqus