Pausar el script Bash Shell durante X segundos

Niraj Menon 24 marzo 2022
  1. Pausar Bash Script por X segundos
  2. Pausar Bash Script por una cantidad variable de tiempo
  3. Pausar la secuencia de comandos de Bash hasta que se produzca la entrada del usuario
  4. Combinar pausas cronometradas con pausas de entrada de usuario
Pausar el script Bash Shell durante X segundos

Los scripts de Bash son bastante útiles para ejecutar varios comandos que quizás no desee tener que escribir línea por línea en el shell de comandos de Bash. En algunos escenarios, es posible que deba pausar su secuencia de comandos, posiblemente para aceptar la entrada de un usuario, o para dormir hasta que se devuelva el resultado de un comando.

Este tutorial explicará las diferentes formas de pausar su script de shell Bash.

Pausar Bash Script por X segundos

Supongamos que escribe su secuencia de comandos desde cero y decide que le gustaría mostrar a los usuarios potenciales un mensaje de bienvenida para que tenga que retrasar el inicio de la secuencia de comandos para que sus usuarios puedan leer el mensaje, lo que explicará lo que su secuencia de comandos hará antes. comienza a ejecutar más comandos Bash. El comando sleep en Bash puede ayudarlo a lograr esto, detallado aquí. Su sintaxis es la siguiente:

sleep n

Donde, n es el número de segundos que te gustaría que esperara. n también puede estar en unidades más pequeñas, como milisegundos, simplemente especificando el número como un número decimal, por lo que si desea hacer una pausa de 30 milisegundos, sleep 0.030 debería ser suficiente!

Tenga en cuenta que n es un argumento obligatorio, por lo que no le diría a sleep cuánto tiempo debe correr. Ejecutar sin un valor para n produciría el siguiente error.

user@linux:~$ sleep
sleep: missing operand
Try 'sleep --help' for more information.

Si desea esperar mucho más que unos segundos, sleep también acepta argumentos que especifican la unidad de tiempo (es decir, minutos, horas, días), así que si quieres esperar una semana entera, sleep 7d es tu solución.

Aquí hay algunos casos de uso para sleep.

# wait 500 milliseconds
sleep 0.5
# wait 1 second
sleep 1
# wait 20 seconds
sleep 20

Para mostrar un mensaje y esperar 1 minuto:

echo "Hello!  This script will run in exactly a minute!"
sleep 1m

Para volver a ejecutar una secuencia de comandos para eliminar los procesos de Python de ejecución prolongada cada semana.

while true
do
    killall --older-than 7d python3
    sleep 7d
done

Pausar Bash Script por una cantidad variable de tiempo

En algunos casos, le gustaría esperar una cantidad de tiempo variable, probablemente porque le gustaría ejecutar la secuencia de comandos con retrasos variables según la cantidad de secuencias de comandos que se estén ejecutando. Un buen ejemplo es si está ejecutando la misma secuencia de comandos varias veces que puede necesitar modificar el mismo archivo, cada invocación de la secuencia de comandos necesitará un retraso diferente para garantizar que no haya dos invocaciones que modifiquen el archivo simultáneamente.

En ese caso, podría convertir n en una variable de estilo Bash real, $N, y establecer su valor en algún punto del script. Un ejemplo es el siguiente:

N=5
sleep $N

La secuencia de comandos en la que se coloca esto debe dormir durante 5 segundos.

Si omite la inicialización de $N y, en su lugar, especifica el valor mientras llama al script, puede usar el valor de N definido en el entorno de shell para proporcionar el período de tiempo sleep al script.

user@linux:~$ cat test.sh
#! /bin/bash
sleep $N
user@linux:~$ export N=3
user@linux:~$ chmod +x test.sh
user@linux:~$ ./test.sh

Como resultado, debería ver que el script se ejecuta durante 3 segundos. Incluso puede anular el valor del entorno y especificarlo en la invocación del script haciendo N=2 ./test.sh.

Incluso puede considerar aleatorizar la cantidad de retraso utilizando $RANDOM como argumento para sleep; por lo tanto, puede decir sleep $RANDOM.

Si el rango de valores de $RANDOM es demasiado grande para usted, aplicar una operación de módulo con un valor agregado opcional para garantizar un retraso mínimo debería permitirle dormir durante un rango de segundos. Por ejemplo, para dormir durante un tiempo determinado, entre 10 y 30 segundos, podrías hacer lo siguiente:

sleep $((10 + RANDOM % 21))

Pausar la secuencia de comandos de Bash hasta que se produzca la entrada del usuario

A veces, esperar una cantidad de tiempo específica no es suficiente; es posible que desee asegurarse de que el usuario haya leído su mensaje de bienvenida y/o esté listo para comenzar a ejecutar su secuencia de comandos. En ese caso, desea esperar a que escriban algo para indicar que están listos para comenzar.

Para ello, utilizaremos el comando read, detallado aquí. read esperará a que se ingresen los datos en la entrada estándar (la línea de comando en la que ingresa los comandos podría llamarse entrada estándar) y una última pulsación de tecla Intro indica al comando que se ingresaron los datos. Luego, la cadena puede colocarse en una variable o simplemente ignorarse, que es el caso de uso que consideraremos aquí.

La invocación más simple de read no requiere argumentos:

read 

Debería hacer que se imprima una nueva línea, en la que escriba algo. Presionar Enter debería devolverlo al indicador de Bash, independientemente de lo que haya escrito anteriormente.

Combinar pausas cronometradas con pausas de entrada de usuario

Un excelente caso de uso que requeriría que combine pausas cronometradas con pausas de entrada del usuario es asegurarse de que desea que su secuencia de comandos continúe ejecutándose si el usuario no responde, y no es importante que lo haga. El comando read nos permite hacer esto especificando un parámetro -t, que toma varios segundos para que el comando espere antes de que se agote el tiempo de espera si no se presiona la tecla Enter. Se usaría de la siguiente manera.

read -t 5

Como resultado, read saldrá cuando se pulse la tecla Enter, o si pasan 5 segundos, lo que ocurra primero.

Otro caso de uso sería esperar una cantidad de tiempo específica especificada por el propio usuario. En ese caso, puede esperar a que el usuario ingrese un valor entero y luego pasarlo como argumento a sleep, como sigue.

echo -n "Enter time to sleep: "
read $time
sleep $time

Por supuesto, esto es bajo el supuesto de que el usuario ingresaría un argumento válido para sleep.

¡Recapitulemos con algunos ejemplos!

  • sleep 3 pausará un guión durante exactamente 3 segundos.
  • sleep 3d pausará un guión durante exactamente 3 días.
  • sleep $N pausará un guión durante la cantidad de segundos especificados como $N.
  • sleep $((10 + RANDOM % 21)) dormirá durante un período de tiempo aleatorio dentro de 10-30 segundos.
  • read espera a que el usuario ingrese algo.
  • read -t 3 espera a que el usuario ingrese algo pero se agota a los 3 segundos si nunca se presiona la tecla Enter.
  • read $tiempo && dormir $tiempo tomará un argumento de cadena del usuario y lo usará como argumento para sleep, permitiéndole al usuario especificar cuánto tiempo dormir.