¿Cómo manejo la falla de un comando en una función de bash?


1

Tengo una función bash en uno de nuestros servidores de prueba que implementa nuestro código, pero uno de los comandos falla con frecuencia y no podemos encontrar la causa. Solo reintentamos hasta que funcione.

Quiero que la función vuelva a intentarlo si falla ese comando. En la función, hice algo como esto:

command_to_run || { echo "failed, retrying"; call_function; }

Lo que vuelve a llamar a la función como quisiera, pero también permite que la función continúe su ejecución. ¿Cómo detengo la ejecución de la función actual antes de volver a llamarla?

Respuestas:


7

Aquí hay una variante aún más simple de la sugerencia de @terdon:

while ! command_to_run; do
    echo "failed, retrying"
    sleep 1
done

while en realidad toma un comando, por lo que puede probar el éxito / fracaso de command_to_run directamente en lugar de tener que lidiar con $?. Normalmente, while ejecuta el bucle siempre que el comando tenga éxito; en este caso, yo uso ! para negarlo y ejecutar el bucle siempre que el comando falle (es decir, hasta que tenga éxito).


+1 Esta es la mejor respuesta.
chepner

De hecho es, +1.
terdon

4

Pruebe un bucle while:

er=1; while [[ $er != 0 ]]; do command_to_run; er=$?; sleep 1; done

Bash guarda el estado de salida del último comando en la variable especial $?. El bucle anterior guarda el estado de salida de command_to_run como $er y luego vuelve a ejecutar el comando hasta que un estado de salida de 0 (Salido correctamente) se devuelve. Se esperará un segundo entre ejecuciones como lo sugiere Flup en los comentarios a continuación.


podría querer poner un sleep allí para evitar un bucle estrecho.
Flup

@Flup buen punto, hecho.
terdon

El sueño no será necesario ya que el comando es de larga duración. Esto funcionó como un encanto, gracias!
Brennan Holzer

0

Encuentro until Es más legible en este caso.

until command_to_run; do
    echo "failed, retrying"
    sleep 1
done
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.