Сделайте cURL возобновление прерванных загрузок с помощью цикла ‘until’

Вопрос или проблема

Вот решение, как заставить 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

Пояснение о работе скрипта

  1. Определение переменных:

    • url: задаем URL загружаемого файла.
    • exit_code: инициализируем переменную значением 18, что соответствует коду ошибки, который cURL возвращает при прерываниях загрузок.
  2. Структура until:

    • until [[ $exit_code -ne 18 ]]; do: цикл будет выполняться до тех пор, пока exit_code равен 18. Как только cURL успешно завершит загрузку (то есть будет возвращен код ошибки, отличный от 18), цикл завершится.
    • curl -O -C - "$url": команда выполняет загрузку файла с возможностью возобновления.
    • exit_code=$?: сохраняем код завершения последней команды cURL для проверки в следующей итерации цикла.

Преимущества использования цикла until

  • Упрощение логики: Использование цикла until может сделать код более читаемым и логичным, так как он продолжает выполнение до тех пор, пока не будет достигнуто требуемое условие.
  • Легкость в изменениях: В случае, если вы захотите изменить логику проверки для других кодов ошибок, это можно сделать непосредственно в строке условия цикла.

Завершение

Это простой и эффективный способ автоматизировать процесс возобновления загрузок в cURL. Применение конструкции until делает ваш код аккуратнее и снижает вероятность ошибок. Оптимизируйте свои загрузки и избавьтесь от необходимости начинать их заново. Надеемся, что приведенное решение поможет вам в дальнейшей работе с cURL и улучшит ваш рабочий процесс!

Оцените материал
Добавить комментарий

Капча загружается...