No, curl
je jen jednoduchý proces UNIX. Těchto curl
můžete mít tolik paralelně běžící procesy a odesílání svých výstupů do různých souborů.
curl
můžete použít část názvu souboru adresy URL ke generování místního souboru. Stačí použít -O
možnost (man curl
podrobnosti).
Můžete použít něco jako následující
urls="http://example.com/?page1.html http://example.com?page2.html" # add more URLs here
for url in $urls; do
# run the curl job in the background so we can start another job
# and disable the progress bar (-s)
echo "fetching $url"
curl $url -O -s &
done
wait #wait for all background jobs to terminate
Moje odpověď je trochu opožděná, ale věřím, že všechny existující odpovědi jsou jen trochu krátké. Způsob, jakým dělám takové věci, je xargs
, který je schopen spouštět zadaný počet příkazů v podprocesech.
Jednovrstvý, který bych použil, je jednoduše:
$ seq 1 10 | xargs -n1 -P2 bash -c 'i=$0; url="http://example.com/?page${i}.html"; curl -O -s $url'
To si zaslouží určité vysvětlení. Použití -n 1
pokyn xargs
pro zpracování jednoho vstupního argumentu najednou. V tomto příkladu čísla 1 ... 10
jsou zpracovány každý samostatně. A -P 2
říká xargs
aby byly neustále spuštěny 2 podprocesy, z nichž každý zpracovává jeden argument, dokud nebudou zpracovány všechny vstupní argumenty.
Můžete si to představit jako MapReduce v shellu. Nebo možná jen fáze mapy. Bez ohledu na to je to účinný způsob, jak odvést spoustu práce a přitom zajistit, že svůj stroj nerozbombardujete. Je možné udělat něco podobného ve smyčce for v shellu, ale skončíte tím, že budete dělat správu procesů, což se začne zdát docela zbytečné, jakmile si uvědomíte, jak šíleně skvělé je toto použití xargs
je.
Aktualizace:Mám podezření, že můj příklad s xargs
by mohl být vylepšen (alespoň na Mac OS X a BSD s -J
vlajka). S GNU Parallel je příkaz také o něco méně nepraktický:
parallel --jobs 2 curl -O -s http://example.com/?page{}.html ::: {1..10}