41

I have a very unstable internet connection, and sometimes have to download files as large as 200 MB.

The problem is that the speed frequently drops and sits at --, -K/s and the process remains alive. I thought just to send some KILL signals to the process, but as I read in the wget manual about signals it doesn't help.

How can I force wget to reinitialize itself and pick the download up where it left off after the connection drops and comes back up again?

I would like to leave wget running, and when I come back, I want to see it downloading, and not waiting with speed --,-K/s.

0
67

In order to avoid the --, -K/s situations you can use --read-timeout=seconds. This will timeout the connection after the amount of seconds.

If you need to go beyond that you can use this setup

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

This will retry refused connections and similar fatal errors (--retry-connrefused), it will wait 1 second before next retry (--waitretry), it will wait a maximum of 20 seconds in case no data is received and then try again (--read-timeout), it will wait max 15 seconds before the initial connection times out (--timeout) and finally it will retry an infinite number of times (-t 0).

You might also want to put this in a while loop in order to avoid local network failure and similar. In this case you also need to add --continue in order to continue the download where you left off. The following works well in 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;

As a bonus tip you can also use --no-dns-cache in case the host balances your request between multiple servers by DNS.

Disclaimer: I do not recommend using this since it will spam the host in case the connection is unstable and it's kind of unwise to leave it unmonitored. However this is what you want in case you really need to download something and your connection doesn't work adequately.

3
  • 3
    by default --read-timeout=900. You could just wait 15 minutes and wget will restart downloading. – Boris Sep 10 '17 at 9:23
  • Thanks for this "retry" help, but for me it still doesn't work 100%, because wget ends with: Unable to establish SSL connection. It doesn't retries on that error. For reproducing try to wget pkg.jenkins.io/debian/jenkins.io.key – Juraj Michalak Oct 31 '19 at 8:50
  • There is also a --retry-on-http-error=code option. In my case the server returned errors 500 every now and then, so I needed to add the --retry-on-http-error=500 to make it work. – juanra Jan 24 '20 at 16:32
26

--tries=number

This option set number of retries to number. Specify 0 or ‘inf’ for infinite retrying.

wget --tries=70 http://example.com/myfile.zip should do it.

The default is to retry 20 times, with the exception of fatal errors like “connection refused” or “not found” (404), which are not retried.

2

Would this help? On askubuntu.com, I found a question very similar to the one you are asking. Here is the link to it: https://askubuntu.com/questions/72663/how-to-make-wget-retry-download-if-speed-goes-below-certain-threshold

1
  • 1
    Link-only answers should be avoided – minexew Feb 16 '20 at 9:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.