Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to re-run the "curl" command automatically when the error occurs

Tags:

linux

bash

curl

Sometimes when I execute a bash script with the curl command to upload some files to my ftp server, it will return some error like:

56 response reading failed

and I have to find the wrong line and re-run them manually and it will be OK.

I'm wondering if that could be re-run automatically when the error occurs.


My scripts is like this:

#there are some files(A,B,C,D,E) in my to_upload directory,
# which I'm trying to upload to my ftp server with curl command
for files in `ls` ;
    do curl -T $files ftp.myserver.com --user ID:pw ;
done

But sometimes A,B,C, would be uploaded successfully, only D were left with an "error 56", so I have to rerun curl command manually. Besides, as Will Bickford said, I prefer that no confirmation will be required, because I'm always asleep at the time the script is running. :)

like image 383
erical Avatar asked Dec 02 '11 02:12

erical


People also ask

How do you use the retry curl command?

Using the --retry option you can tell curl to retry certain failed transfers. If a transient error is returned when curl tries to perform a transfer, it will retry this number of times before giving up. Setting the number to 0 makes curl do no retries (which is the default).

Does curl Auto Retry?

When curl is about to retry a transfer, it will first wait one second and then for all forthcoming retries it will double the waiting time until it reaches 10 minutes which then will be the delay between the rest of the retries. By using --retry-delay you disable this exponential backoff algorithm.

Why is my curl command not working?

If you get an error message saying curl command not found when trying to download a file with curl , it means that the curl package is not installed on your Ubuntu machine. That's it! You have successfully installed curl on your Ubuntu machine, and you can start using it.


2 Answers

Here's a bash snippet I use to perform exponential back-off:

# Retries a command a configurable number of times with backoff.
#
# The retry count is given by ATTEMPTS (default 5), the initial backoff
# timeout is given by TIMEOUT in seconds (default 1.)
#
# Successive backoffs double the timeout.
function with_backoff {
  local max_attempts=${ATTEMPTS-5}
  local timeout=${TIMEOUT-1}
  local attempt=1
  local exitCode=0

  while (( $attempt < $max_attempts ))
  do
    if "$@"
    then
      return 0
    else
      exitCode=$?
    fi

    echo "Failure! Retrying in $timeout.." 1>&2
    sleep $timeout
    attempt=$(( attempt + 1 ))
    timeout=$(( timeout * 2 ))
  done

  if [[ $exitCode != 0 ]]
  then
    echo "You've failed me for the last time! ($@)" 1>&2
  fi

  return $exitCode
}

Then use it in conjunction with any command that properly sets a failing exit code:

with_backoff curl 'http://monkeyfeathers.example.com/'
like image 68
phs Avatar answered Oct 29 '22 03:10

phs


Perhaps this will help. It will try the command, and if it fails, it will tell you and pause, giving you a chance to fix run-my-script.

COMMAND=./run-my-script.sh 
until $COMMAND; do 
    read -p "command failed, fix and hit enter to try again."
done
like image 36
Kevin Avatar answered Oct 29 '22 05:10

Kevin