Esegue le richieste di arricciatura in parallelo in bash


23

Qual è il modo migliore per eseguire 5 curlrichieste parallelda uno script bash? Non posso eseguirli in serie per motivi di prestazioni.


1
Hai provato a cercare parti della tua soluzione? Un'altra domanda di SF sembra essere esattamente quello che stai chiedendo: serverfault.com/questions/248143/…
Theuni

Risposte:


34

Utilizzare '&' dopo un comando per eseguire il background di un processo e 'wait' per attendere che finiscano. Usa '()' attorno ai comandi se devi creare una sotto-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

Semplice, ma efficace per il primo passo. Si scatena rapidamente quando le cose devono cambiare, come il nome host o il numero di ripetizioni. Grazie.
Chris,



0

Ecco un curlesempio con xargs:

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

L'esempio sopra dovrebbe curlciascuno degli URL in parallelo, 10 alla volta. Il -n 1è là in modo che xargsutilizza solo 1 riga dal URLS.txtfile per curll'esecuzione.

Cosa fanno ciascuno dei parametri di 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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.