Wykonuj żądania curl równolegle w bash

23

Jaki jest najlepszy sposób na wykonanie 5 curlżądań parallelze skryptu bash? Nie mogę uruchomić ich szeregowo ze względu na wydajność.

Justin
źródło
1
Czy próbowałeś szukać części swojego rozwiązania? Kolejne pytanie SF wydaje się być dokładnie tym, o co prosisz: serverfault.com/questions/248143
Theuni
stackoverflow.com/questions/8634109/...
Ciro Santilli 26 改造 中心 法轮功 六四 事件

Odpowiedzi:

34

Użyj polecenia „&” po poleceniu, aby uruchomić proces w tle, i „poczekaj”, aby poczekać na zakończenie procesu. Użyj „()” wokół poleceń, jeśli chcesz utworzyć podpowłokę.

#!/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
źródło
Prosty, ale skuteczny na pierwszy krok. Szybko się zmienia, gdy trzeba coś zmienić, na przykład nazwa hosta lub liczba powtórzeń. Dzięki.
Chris
6

Używam GNU równolegle do takich zadań.

Dennis Kaarsemaker
źródło
4
Czy mógłby Pan podać przykład za telefon curlz gnu parallel?
m13r
Tak, równoległe wydaje się bardzo dobre i łatwo wysłać to samo zapytanie 100 razy. Ale przykład użycia równoległego z wysyłaniem 100 różnych żądań curl poprawiłby tę odpowiedź.
рüффп
0

Oto curlprzykład z xargs:

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

Powyższy przykład powinien zawierać curlkażdy z adresów URL równolegle, po 10 naraz. -n 1Jest tak, że xargsużywa tylko 1 linię z URLS.txtpliku za curlwykonanie.

Co każdy z parametrów xargs robi:

$ 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
źródło