linux - query - logstash tutorial
cómo volver a ejecutar el comando "curl" automáticamente cuando se produce el error (2)
A veces, cuando ejecuto un script de bash con el comando curl
para cargar algunos archivos en mi servidor ftp, devolverá un error como:
56 response reading failed
y tengo que encontrar la línea incorrecta y volver a ejecutarlos manualmente y estará bien.
Me pregunto si eso podría volver a ejecutarse automáticamente cuando se produce el error.
Mis guiones son así:
#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
Pero a veces A, B, C, se cargarían con éxito, solo D quedaba con un "error 56", por lo que tengo que volver a ejecutar el comando curl manualmente. Además, como dijo Will Bickford, prefiero que no se requiera confirmación, porque siempre estoy dormido cuando se ejecuta el script. :)
Aquí hay un fragmento de bash que uso para realizar un retroceso exponencial:
# 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
}
Luego, úselo junto con cualquier comando que establezca correctamente un código de salida defectuoso:
with_backoff curl ''http://monkeyfeathers.example.com/''
Quizás esto ayude. Intentará el comando, y si falla, te dirá y hará una pausa, dándote la oportunidad de arreglar el run-my-script
.
COMMAND=./run-my-script.sh
until $COMMAND; do
read -p "command failed, fix and hit enter to try again."
done