script bash: repita el comando si devuelve un error

Respuestas:

40

Encontré la base para este elegante bucle en otro lugar en serverfault. Resulta que no es necesario guardar el código de salida, ya que puede probar directamente en el comando en sí;

until ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file; do
  echo Tansfer disrupted, retrying in 10 seconds...
  sleep 10
done
Roy
fuente
8

Casi. Probablemente sea mejor guardar el valor de retorno como una variable para que pueda preestablecerlo antes del ciclo. De lo contrario, se verá afectado por el comando de última ejecución.

También es posible que desee colocar una honda sleepallí para evitar que vuelva a aparecer demasiado rápido.

RET=1
until [ ${RET} -eq 0 ]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
    RET=$?
    sleep 10
done
Dan Carley
fuente
Creo que olvidé pasar el código de salida a la variable RET, pero tengo la idea. Mi pregunta principal es cuándo se evaluará la cláusula `` till ''. En C no se evaluará hasta después de la primera ejecución del ciclo, en cuyo caso mi ciclo debería funcionar. Sin embargo, el tuyo es aún mejor, ya que permite comandos intermedios como el sueño. ¡Gracias!
Roy
Bien descrito. Lo he editado La cláusula se evaluará antes de la primera ejecución. Entonces, anteriormente usaría el código de retorno de cualquier comando anterior. Bash no aplica los dobles iguales, pero es una buena práctica usarlos.
Dan Carley el
== es por la igualdad cadena no numérica, aunque no creo que importe en este caso ...
Kyle Brandt
Los iguales simples y dobles son iguales. Pero sería mejor usar la igualdad de enteros ahora que lo mencionas.
Dan Carley el
1
No necesita probar el número del código de retorno, solo puede probar el código de retorno del programa en sí mismo, hasta que el programa; duerme 3; hecho .
Chris
3

Un poco hacky pero mi solución fue crear una función bash que se ejecute sola si sale con una falla

function retry { the_command_you_want && echo "success" || (echo "fail" && retry) }; retry
Qwertie
fuente
0

Puede hacer un bucle mientras su comando devuelve un error:

    while [ -n $(ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file) ]; do
            sleep 1;
    done;
Andrés Rivas
fuente
3
Esta respuesta necesita explicación.
kasperd
Explicación @kasperd agregada
Andrés Rivas