En esta breve guía, vamos a aprender cómo repetir un comando hasta que tenga éxito en Linux. Esto puede ser útil en muchas ocasiones. Por ejemplo, puede usar este método para verificar la conectividad de red entre dos o más hosts o verificar la conectividad de Internet para ver si todavía está en línea o fuera de línea. Entonces, sea cual sea el motivo, si alguna vez quiso repetir un comando o programa de Linux hasta que finalice con éxito, esta guía lo ayudará.
Repita el comando hasta que tenga éxito en Linux
Para la ejecución repetitiva de una lista de comandos, usamos las siguientes construcciones de bucle BASH :
- Mientras bucle,
- Hasta bucle.
Mientras Bucle ejecuta el bloque de código (incluido dentro de do ... done ) cuando la condición es verdadera y sigue ejecutándolo hasta que la condición se vuelve falsa . Una vez que la condición se vuelve falsa , el bucle while finaliza.
Hasta Bucle es justo lo contrario del bucle While. Ejecuta el bloque de código (incluido dentro de do ... done ) cuando la condición es falsa y seguir ejecutándolo hasta que la condición se vuelva verdadera . Una vez que la condición se vuelve verdadera , el bucle hasta que finaliza.
Primero, veamos cómo repetir un comando de Linux o un programa hasta que tenga éxito usando el bucle While.
1. Repita un comando hasta que tenga éxito usando el ciclo While
Eche un vistazo al siguiente comando:
$ while ! ping -c 3 ostechnix.com ; do sleep 2 ; done ; xcalc
Este comando seguirá intentando hacer ping al sitio ostechnix.com. Una vez que el sitio esté en línea, el ciclo Mientras terminará y mostrará "xcalc" programa. Aquí, xcalc es opcional. Es solo para fines de notificación. De lo contrario, es posible que debamos seguir revisando la ventana de la Terminal para verificar si el comando se ejecutó correctamente o no.
Explicación:
Analicemos el comando anterior y veamos qué hace cada instrucción.
while ! ping -c 3 ostechnix.com ;
Esta es la declaración condicional. Como puede ver en esta declaración, antecedemos el comando ping con ! personaje. Sirve como "NOT" condición. Entonces, el significado real de la línea anterior es:mientras NO pueda hacer ping a ostechnix.com .
do sleep 2 ; done ;
La afirmación "duerme 2" , indica que no golpee el sistema intentando repetidamente el comando ping cada segundo. Le indicamos al sistema que espere un poco, por ejemplo, 2 segundos, y luego intente hacer ping a ostechnix.com. En otras palabras, el comando Mientras seguirá haciendo ping al sitio cada 2 segundos. Una vez que la condición se vuelve falsa, el ciclo while terminará.
xcalc ;
Ejecute el programa xcalc. Este programa se ejecutará solo después de la ejecución exitosa del comando anterior.
Entonces, según el comando anterior, si la condición es verdadera (es decir, si ostechnix.com "NO" es accesible), ejecutará el bloque de código incluido en do...done . Aquí, el código es "dormir 2". Así que espera 2 segundos y luego vuelve a intentar hacer ping al sitio. Seguirá ejecutándose hasta que la condición se vuelva falsa. Una vez que la condición se vuelve falsa (es decir, si se puede acceder a ostechnix.com), el ciclo terminará y finalmente se abrirá el programa xcalc.
Este es el resultado de muestra del comando anterior:
ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known PING ostechnix.com (104.26.5.40) 56(84) bytes of data. 64 bytes from 104.26.5.40 (104.26.5.40): icmp_seq=1 ttl=55 time=63.6 ms 64 bytes from 104.26.5.40 (104.26.5.40): icmp_seq=2 ttl=55 time=84.8 ms 64 bytes from 104.26.5.40 (104.26.5.40): icmp_seq=3 ttl=55 time=79.9 ms --- ostechnix.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2001ms rtt min/avg/max/mdev = 63.602/76.114/84.810/9.068 ms Warning: Cannot convert string "-adobe-symbol-*-*-*-*-*-120-*-*-*-*-*-*" to type FontStruct
2. Repita un comando hasta que tenga éxito usando el bucle Hasta
También puede hacer esto usando el bucle "Hasta" como se muestra a continuación.
$ until ping -c 3 ostechnix.com ; do sleep 2 ; done ; xcalc
Analicemos este comando y veamos qué hace cada declaración:
until ping -c 3 ostechnix.com ;
Esta es la declaración condicional. Significa:hacer ping hasta que se pueda acceder al sitio.
do sleep 2 ; done ;
Intente hacer ping al sitio cada 2 segundos hasta que sea accesible. Una vez que la condición se vuelve verdadera, es decir, se puede acceder al sitio, el bucle finalizará.
xcalc
Ejecute el programa xcalc. Solo se ejecutará tras la ejecución exitosa de los comandos anteriores.
Entonces, según el comando anterior, el ciclo Hasta seguirá haciendo ping a ostechnix.com hasta que tenga éxito. Una vez que se pueda acceder al sitio, el ciclo hasta finalizará y se abrirá el programa xcalc.
Lectura relacionada:
- Cómo ejecutar un comando de Linux cada X segundos para siempre
3. Repita el comando anterior hasta que tenga éxito
Ahora sabemos cómo ejecutar un comando de Linux hasta que se cierra con éxito. ¿Qué pasa con el comando anterior? ¿Cómo repite o vuelve a intentar los comandos anteriores hasta que tenga éxito? ¡Eso también es fácil!
Ya hemos publicado diferentes formas de repetir el último comando. Si no sabe cómo hacerlo, consulte la siguiente guía.
- Diferentes formas de repetir su último comando en Linux
Como se indica en el enlace anterior, para ejecutar cualquier último comando ejecutado, simplemente escriba dobles signos de exclamación y presione ENTER como se muestra a continuación:
$ !!
Esto ejecutará el último comando.
Entonces, si desea repetir los comandos anteriores hasta que tengan éxito usando el ciclo While, ejecute:
$ !!; while [ $? -ne 0 ]; do !!; done
Para repetir los comandos anteriores hasta que tengan éxito usando el bucle Hasta, ejecute:
$ until !!; do :; done
Para obtener más ejemplos sobre el ciclo Bash While y el ciclo Until, consulte la siguiente guía:
- Secuencias de comandos de Bash:ciclo while y till explicado con ejemplos