Heute möchte ich euch vorstellen, wie es möglich ist mehrere Kommandos multithreaded in der Bash auszuführen. Einen konkreten Anwendungsfall könnt ihr euch wie folgt vorstellen:
Ihr habt eine Liste mit IP-Adressen die ihr pingen wollt. Oder noch besser eine List mit Objekten, die ihr gegen einen Server mittels curl POSTen wollt. Oder klassisch eine Liste von URLs die ihr herunterladen wollt. Eine solche Liste könnte so aussehen:
tecbauer@XELO:/tmp$ cat urls.txt
google.de
tecbauer.de
google.com
bing.de
Ganz simple könnte man jetzt hergehen, über jede Zeile der Datei iterieren und den Prozess mit &
in den Hintergrund legen, z. B. so:
for i in $(cat urls.txt); do wget -O- $i &; done
Wie aber kontrollieren wir aber nun wie viele Threads gleichzeitig gestartet werden? – Gar nicht. Es wäre viel zu kompliziert eine Logik dafür in einem Terminal auf einen Rutsch einzutippen. Stattdessen benutzen wir das Kommando xargs und dessen Option -P
mit dieser Option kann man angeben mit wie vielen Threads der std-input in xargs verabeitet werden soll. Das ganze würde dann so aussehen:
cat urls.txt | xargs -P 4 -i wget -O- {}
Wir arbeiten also die Liste mit insgesamt 4 Threads ab. Und laden die Ressourcen paralell herunter.