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

23

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

Justin
la source
1
Avez-vous essayé de rechercher des parties de votre solution? Une autre question SF semble être exactement ce que vous demandez: serverfault.com/questions/248143/…
Theuni
stackoverflow.com/questions/8634109/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Réponses:

34

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
Anton Cohen
la source
Simple, mais efficace pour une première étape. Obtient rapidement hacky lorsque les choses doivent changer, comme le nom d'hôte ou le nombre de répétitions. Merci.
Chris
6

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

Dennis Kaarsemaker
la source
4
Pourriez-vous fournir un exemple pour appeler curlavec gnu parallel?
m13r
Oui, le parallèle semble très bon et il est facile d'envoyer 100 fois la même demande. Mais un exemple sur la façon d'utiliser en parallèle l'envoi de 100 demandes de boucles différentes améliorerait cette réponse.
рüффп
0

Voici un curlexemple avec xargs:

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

L'exemple ci-dessus doit curlchacune des URL en parallèle, 10 à la fois. Le -n 1est là pour que xargsn'utilise qu'une ligne du URLS.txtfichier par curlexé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.
Charlie Le
la source