Ejecutar solicitudes curl en paralelo en bash

23

¿Cuál es la mejor manera de ejecutar 5 curlsolicitudes paralleldesde un script bash? No puedo ejecutarlos en serie por razones de rendimiento.

Justin
fuente
1
¿Has intentado buscar partes de tu solución? Otra pregunta de SF parece ser exactamente lo que está pidiendo: serverfault.com/questions/248143/…
Theuni
stackoverflow.com/questions/8634109/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

34

Use '&' después de un comando para poner en segundo plano un proceso y 'esperar' para esperar a que finalicen. Use '()' alrededor de los comandos si necesita crear un sub-shell.

#!/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
fuente
Simple, pero efectivo para un primer paso. Se vuelve loco rápidamente cuando las cosas necesitan cambiar, como el nombre de host o la cantidad de repeticiones. Gracias.
Chris
6

Yo uso GNU paralelo para tareas como esta.

Dennis Kaarsemaker
fuente
44
Podría dar un ejemplo para llamar curla gnu parallel?
m13r
Sí, el paralelo parece muy bueno y es fácil enviar la misma solicitud 100 veces. Pero un ejemplo sobre cómo usar paralelo con el envío de 100 solicitudes de rizo diferentes mejoraría esta respuesta.
рüффп
0

Aquí hay un curlejemplo con xargs:

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

El ejemplo anterior debe curlcada una de las URL en paralelo, 10 a la vez. El -n 1está allí para que xargssolo use 1 línea del URLS.txtarchivo por curlejecución.

Lo que hace cada uno de los parámetros de xargs:

$ 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
fuente