Quiero escribir lógica en el script de shell que volverá a intentar ejecutarlo después de 15 segundos hasta 5 veces según "código de estado = FALLO" si falla debido a algún problema.
shell-script
Sandeep Singh
fuente
fuente
break
si el comando tiene éxito, entonces se romperá el cicloif command; then break; fi
o más sucintamente solocommand && break
n
fallas, duerme innecesariamente una vez más antes de salir.Reemplace "comando" con su comando. Esto supone que "código de estado = FALLO" significa cualquier código de retorno distinto de cero.
Variaciones:
Usando la
{..}
sintaxis. Funciona en la mayoría de los shells, pero no en BusyBoxsh
:Usando
seq
y pasando el código de salida del comando fallido:Igual que el anterior, pero omitiendo
sleep 15
después del fallo final. Dado que es mejor definir solo el número máximo de bucles una vez, esto se logra durmiendo al comienzo del bucle sii > 1
:fuente
for i in 1 2 3 4 5
confor i in {1..5}
porque es más fácil de mantener.&&
se evalúa antes que||
por la precedenciacommand
falla.[[ i -eq 5]]
como una condición OR antes del sueño para evitar esto.Ejemplo:
produce esta salida:
Para ver un ejemplo práctico del mundo real con comandos complejos, consulte este script .
fuente
Aquí está la función para reintentar
Salida:
fuente
bash retry.sh 3 ping -c1 localhost
GNU Parallel tiene
--retries
:fuente
Aquí está mi alias / script favorito de una línea
Entonces puedes hacer cosas como:
y seguirá ejecutando el comando anterior hasta que encuentre "Siguiente proceso"
fuente
fc -e "#"
lugar defc -s
.Utilizo este script que realiza los reintentos de un comando dado, el beneficio de este script es que si falla todos los reintentos conservará el código de salida.
Probablemente puede ser más simple
fuente
Ver abajo Ejemplo:
Estoy tratando de conectar el puerto 3389 en localhost, volverá a intentarlo hasta que falle 5 veces, si tiene éxito, romperá el ciclo.
$?
es el estado del comando si cero significa que el comando se ejecutó con éxito, si otro que cero significa comando faiParece un poco complicado, puede ser que alguien lo haga mejor que esto.
fuente
$?
es el estado del comando si cero significa que el comando se ejecutó correctamente, si otro que cero significa que el comando fallaPuede usar el
loop
comando, disponible aquí , así:Que hará lo suyo cada 15 segundos hasta que tenga éxito, por un máximo de cinco veces.
fuente
Aquí hay una
retry
función recursiva para puristas de programación funcional:Páselo un comando (o un nombre de función) y, opcionalmente, una serie de reintentos y una duración de suspensión entre reintentos, de esta manera:
fuente