![Как: одновременные загрузки cURL?](https://rvso.com/image/1539560/%D0%9A%D0%B0%D0%BA%3A%20%D0%BE%D0%B4%D0%BD%D0%BE%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8%20cURL%3F.png)
Как мы можем использовать curl для загрузки нескольких файлов одновременно? Даже если нам нужно запустить несколько процессов curl, как я могу сделать это из командной строки или функции оболочки? Например:
$ multiCurl <download 1> <download 2> <download 3>
multiCurl () {
curl <download 1>
curl <download 2>
curl <download 3>
}
или
for link in $(cat download.list); do
curl <link 1>
curl <link 2>
curl <link 3>
curl <link 4>
done
решение1
Возможно, вы можете использовать команду parallel
для одновременной загрузки нескольких файлов.
Здесь я предполагаю, что вы сохраняете оригинальное имя файла
#!/usr/bin/env bash
funcDownloadOperation(){
link="${1:-}"
curl -fsSL -O "${link}"
if [[ -s "${link##*/}" ]]; then
echo "file ${link##*/} download successfully!"
else
echo "fail to download link ${link}"
fi
}
export -f funcDownloadOperation
cat download.list | parallel -k -j 0 funcDownloadOperation
Вам необходимо parallel
вручную установить утилиту в вашей системе Linux.
решение2
Просто добавьте &
в конце каждой команды, чтобы она выполнялась в фоновом режиме:
curl <link 1>&
После всего этого зависит, хотите ли вы знать, когда эти команды заканчиваются и каков их код возврата. Если так, попробуйте что-то вроде:
set -a pids # Array of the process ids of background commands
for url in $whatever_the_list_of_urls
do
curl $url& # start CURL in background
pids[${#pids[*]}]=$! # remember PID
done
# all started, now wait for them
for pid in ${pids[*]}
do
wait $pid
print "Sensed end of $pid, rc:=$?"
done