web-dev-qa-db-fra.com

Exécuter des requêtes curl en parallèle dans bash

Quelle est la meilleure façon d'exécuter 5 curl requêtes dans parallel à partir d'un script bash? Je ne peux pas les exécuter en série pour des raisons de performances.

23
Justin

Utilisez '&' après une commande pour mettre en arrière-plan un processus, et 'wait' pour attendre la fin. Utilisez '()' autour des commandes si vous devez créer un sous-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
34
Anton Cohen

xargs a un paramètre "-P" pour exécuter les processus en parallèle. Par exemple:

wget -nv http://en.wikipedia.org/wiki/Linux -O- | egrep -o "http://[^[:space:]]*.jpg" | xargs -P 10 -r -n 1 wget -nv

Référence: http://www.commandlinefu.com/commands/view/3269/parallel-file-downloading-with-wget

10
Fan___

J'utilise gnu parallel pour des tâches comme celle-ci.

6
Dennis Kaarsemaker

Voici un exemple de curl avec xargs:

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

L'exemple ci-dessus doit curl chacune des URL en parallèle, 10 à la fois. Le -n 1 est là pour que xargs utilise seulement 1 ligne du URLS.txt fichier par curl exécution.

Ce que fait chacun des paramètres 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.
0
Charlie Le