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.
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.
Réponses:
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
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
J'utilise gnu parallel pour des tâches comme celle-ci.
curlavec gnu parallel?
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.