Führen Sie Curl-Requests parallel in der Bash aus

23

Was ist der beste Weg, um 5 curlRequests in paralleleinem Bash-Skript auszuführen ? Ich kann sie aus Leistungsgründen nicht seriell ausführen.

Justin
quelle
1
Haben Sie versucht, nach Teilen Ihrer Lösung zu suchen? Eine andere SF-Frage scheint genau das zu sein, wonach Sie fragen: serverfault.com/questions/248143/…
Theuni

Antworten:

34

Verwenden Sie nach einem Befehl '&', um einen Prozess im Hintergrund anzuzeigen, und 'wait', um zu warten, bis der Vorgang abgeschlossen ist. Verwenden Sie '()' um die Befehle, wenn Sie eine Unterschale erstellen müssen.

#!/bin/bash

curl -s -o foo http://example.com/file1 && echo "done1" &
curl -s -o bar http://example.com/file2 && echo "done2" & 
curl -s -o baz http://example.com/file3 && echo "done3" &

wait
Anton Cohen
quelle
Einfach, aber effektiv für einen ersten Schritt. Wird schnell hacky, wenn sich Dinge ändern müssen, wie der Hostname oder die Anzahl der Wiederholungen. Vielen Dank.
Chris
6

Ich benutze Gnu parallel für solche Aufgaben.

Dennis Kaarsemaker
quelle
4
Können Sie ein Beispiel für einen Anruf curlmit angeben gnu parallel?
18.
Ja, Parallelität scheint sehr gut zu sein und es ist einfach, die gleiche Anfrage 100 Mal zu senden. Ein Beispiel für die parallele Verwendung beim Senden von 100 verschiedenen Curl-Anforderungen würde diese Antwort jedoch verbessern.
27.
0

Hier ist ein curlBeispiel mit xargs:

$ cat URLS.txt | xargs -P 10 -n 1 curl

Das obige Beispiel sollte curljeweils 10 URLs gleichzeitig enthalten. Das -n 1gibt es so, dass pro Ausführung xargsnur 1 Zeile aus der URLS.txtDatei verwendet wird curl.

Was jeder der xargs-Parameter bewirkt:

$ man xargs

-P maxprocs
             Parallel mode: run at most maxprocs invocations of utility at once.
-n number
             Set the maximum number of arguments taken from standard input for 
             each invocation of utility.  An invocation of utility will use less 
             than number standard input arguments if the number of bytes 
             accumulated (see the -s option) exceeds the specified size or there 
             are fewer than number arguments remaining for the last invocation of 
             utility.  The current default value for number is 5000.
Charlie Le
quelle