Как повторить соединение с wget?

29

У меня очень нестабильное интернет-соединение, и иногда приходится загружать файлы размером до 200 МБ.

Проблема в том, что скорость часто падает, а --, -K/sпроцесс остается живым. Я думал просто отправить несколько сигналов KILL процессу, но, как я читаю в руководстве по wget о сигналах, это не помогает.

Как я могу заставить wgetсебя повторно инициализировать себя и забрать загрузку с того места, где она была прервана после того, как соединение обрывается и снова возвращается?

Я хотел бы оставить wgetработать, и когда я вернусь, я хочу видеть его загрузки, а не ожидания со скоростью --,-K/s.

Андрей
источник

Ответы:

47

Во избежание --, -K/sситуаций вы можете использовать --read-timeout=seconds. Это приведет к превышению времени ожидания соединения через несколько секунд.

Если вам нужно пойти дальше, вы можете использовать эту настройку

wget --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 -t 0

Это приведет к повторным попыткам отклоненных подключений и аналогичным фатальным ошибкам ( --retry-connrefused), будет ждать 1 секунду перед следующей повторной попыткой ( --waitretry), будет ждать максимум 20 секунд, если не будет получено никаких данных, а затем попытаться снова ( --read-timeout), будет ждать максимум 15 секунд до истечения времени ожидания первоначального соединения ( --timeout) и, наконец, оно будет повторяться бесконечное число раз ( -t 0).

Вы можете также захотеть поместить это в whileцикл, чтобы избежать сбоя локальной сети и тому подобного. В этом случае вам также нужно добавить --continue, чтобы продолжить загрузку, где вы остановились. Следующее хорошо работает в Bash

while [ 1 ]; do
    wget --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 -t 0 --continue
    if [ $? = 0 ]; then break; fi; # check return value, break if successful (0)
    sleep 1s;
done;

В качестве бонуса вы также можете использовать, --no-dns-cacheесли хост балансирует ваш запрос между несколькими серверами по DNS.

Отказ от ответственности: я не рекомендую использовать это, так как это будет спамить хост в случае нестабильного соединения, и было бы неразумно оставлять его без присмотра. Однако это то, что вам нужно, если вам действительно нужно что-то скачать и ваше соединение не работает должным образом.

колокол
источник
2
по умолчанию --read-timeout=900. Вы можете просто подождать 15 минут и wget возобновит загрузку.
Борис
Спасибо за эту «повторную» помощь, но для меня она все еще не работает на 100%, потому что wget заканчивается: Невозможно установить соединение SSL. Это не повторяет эту ошибку. Для воспроизведения попробуйте wget pkg.jenkins.io/debian/jenkins.io.key
Juraj Michalak
20

--tries=number

Эта опция устанавливает количество повторных попыток в число. Укажите 0 или «inf» для бесконечной повторной попытки.

wget --tries=70 http://example.com/myfile.zip должен сделать это.

По умолчанию повторяется 20 раз, за исключением фатальных ошибок, таких как «отказано в соединении» или «не найден» (404), которые не повторяются.

Manu
источник