Вопрос или проблема
Вот решение, как заставить cURL автоматически возобновлять прерванные загрузки, из блога Хуана Нуньеса-Иглесиаса 2013 года:
export ec=18; while [ $ec -eq 18 ]; do curl -O -C - http://site.xyz/file.zip; export ec=$?; done
Это было опубликовано несколько раз здесь и на Stack Overflow, как в оригинальной версии, так и с небольшими изменениями внутри цикла while
.
Изменения внутри цикла while
были внесены разными людьми для повышения надежности скрипта.
- “Код завершения, который возвращает curl, когда загрузка прерывается, равен 18, а
$?
дает код завершения последней команды в bash. Поэтому, пока код завершения равен 18, продолжайте пытаться загрузить файл, сохраняя имя файла (-O
) и возобновляя с места, где остановилась предыдущая загрузка (-C
).” – Хуан Нуньес-Иглесиас - “Как указывает Ян в комментариях, в зависимости от того, что происходит с загрузкой, ваш код ошибки может быть другим. Просто замените 18 на тот код ошибки, который вы видите, чтобы это работало для вас! (Если вы чувствуете себя смелым, вы можете изменить условие на
while [ $ec -ne 0 ]
, но это похоже на использование голого except в Python, что плохо. ;)” – Хуан Нуньес-Иглесиас - “В моем случае curl завершает работу с разными кодами, поэтому я проверяю код успешности:
while [ $ec -ni 0 ]
” – Илья Бельский
В марте Хелдер Магальянш предложил заменить цикл while
в оригинальной версии Хуана на until
:
Это решение можно еще больше упростить, используя
until
. См. связанную тему.
Хотя я не особенно умею использовать cURL или писать скрипты на оболочке, я бы попытался написать это сам, но проблема написать это самостоятельно заключается не в самом скрипте, а в отсутствии понимания того, как правильно его тестировать.
Не могли бы вы показать, как реализовать идею Хелдера? И действительно ли это делает скрипт более надежным?
Я использую Zsh.
Ответ или решение
Как использовать cURL для возобновления прерванных загрузок с помощью цикла until
в Zsh
Если вы когда-либо сталкивались с проблемами прерывания загрузок, вы, возможно, задавались вопросом, как эффективно возобновлять загрузки с использованием cURL
. В данной статье мы рассмотрим подход, предложенный Хелдером Магальяйшем, который включает использование цикла until
для упрощения процесса.
Основы работы с cURL
cURL
— это мощный инструмент для передачи данных с использованием URL-адресов. Он существенно облегчает загрузку файлов из сети, особенно если загрузка может быть прервана по различным причинам (например, нестабильное интернет-соединение). Основные параметры, которые мы будем использовать:
-O
: указываетcURL
сохранять файл с тем же именем, что и в исходном URL.-C -
: позволяетcURL
возобновить загрузку файла с места прерывания.
Цикл until
для возобновления загрузок
Вместо того чтобы использовать цикл while
, Хелдер предлагает использовать until
, что делает скрипт более интуитивным и проще для восприятия. Вот пример реализации:
#!/bin/zsh
url="http://site.xyz/file.zip"
exit_code=18
until [[ $exit_code -ne 18 ]]; do
curl -O -C - "$url"
exit_code=$?
done
Пояснение о работе скрипта
-
Определение переменных:
url
: задаем URL загружаемого файла.exit_code
: инициализируем переменную значением18
, что соответствует коду ошибки, которыйcURL
возвращает при прерываниях загрузок.
-
Структура
until
:until [[ $exit_code -ne 18 ]]; do
: цикл будет выполняться до тех пор, покаexit_code
равен18
. Как толькоcURL
успешно завершит загрузку (то есть будет возвращен код ошибки, отличный от18
), цикл завершится.curl -O -C - "$url"
: команда выполняет загрузку файла с возможностью возобновления.exit_code=$?
: сохраняем код завершения последней командыcURL
для проверки в следующей итерации цикла.
Преимущества использования цикла until
- Упрощение логики: Использование цикла
until
может сделать код более читаемым и логичным, так как он продолжает выполнение до тех пор, пока не будет достигнуто требуемое условие. - Легкость в изменениях: В случае, если вы захотите изменить логику проверки для других кодов ошибок, это можно сделать непосредственно в строке условия цикла.
Завершение
Это простой и эффективный способ автоматизировать процесс возобновления загрузок в cURL
. Применение конструкции until
делает ваш код аккуратнее и снижает вероятность ошибок. Оптимизируйте свои загрузки и избавьтесь от необходимости начинать их заново. Надеемся, что приведенное решение поможет вам в дальнейшей работе с cURL
и улучшит ваш рабочий процесс!