Jalankan permintaan ikal secara paralel di bash

23

Apa cara terbaik untuk mengeksekusi 5 curlpermintaan paralleldari skrip bash? Saya tidak bisa menjalankannya secara serial karena alasan kinerja.

Justin
sumber
1
Sudahkah Anda mencoba mencari bagian dari solusi Anda? Pertanyaan SF lain tampaknya persis seperti yang Anda minta: serverfault.com/questions/248143/…
Theuni
stackoverflow.com/questions/8634109/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

34

Gunakan '&' setelah perintah untuk melatarbelakangi suatu proses, dan 'tunggu' untuk menunggu sampai selesai. Gunakan '()' di sekitar perintah jika Anda perlu membuat sub-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
sumber
Sederhana, tetapi efektif untuk langkah pertama. Mendapat hacky dengan cepat ketika hal-hal perlu diubah, seperti nama host atau jumlah pengulangan. Terima kasih.
Chris
6

Saya menggunakan paralel gnu untuk tugas-tugas seperti ini.

Dennis Kaarsemaker
sumber
4
Bisakah Anda memberikan contoh untuk menelepon curldengan gnu parallel?
m13r
Ya, paralel tampaknya sangat baik dan mudah untuk mengirim permintaan yang sama 100 kali. Tetapi contoh tentang cara menggunakan paralel dengan mengirim 100 permintaan ikal yang berbeda akan membuat jawaban ini lebih baik.
рüффп
0

Berikut ini curlcontoh dengan xargs:

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

Contoh di atas harus curlmasing-masing URL secara paralel, 10 sekaligus. Apakah -n 1ada sehingga xargshanya menggunakan 1 baris dariURLS.txt file per curleksekusi.

Apa yang dilakukan masing-masing parameter 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
sumber