Pause du script shell bash pendant X secondes

Niraj Menon 30 janvier 2023
  1. Pause du script bash pendant X secondes
  2. Suspendre le script bash pendant une durée variable
  3. Suspendre le script bash jusqu’à ce que l’entrée de l’utilisateur se produise
  4. Combinez des pauses chronométrées avec des pauses saisies par l’utilisateur
Pause du script shell bash pendant X secondes

Les scripts Bash sont très utiles pour exécuter plusieurs commandes que vous ne voudrez peut-être pas taper ligne par ligne dans le shell de commande Bash. Dans certains scénarios, vous devrez peut-être interrompre votre script, éventuellement pour accepter l’entrée d’un utilisateur, ou vous mettre en veille jusqu’à ce que le résultat d’une commande ait été renvoyé.

Ce tutoriel vous expliquera les différentes manières de mettre en pause votre script shell Bash.

Pause du script bash pendant X secondes

Supposons que vous écriviez votre script à partir de zéro et que vous décidiez d’afficher un message de bienvenue aux utilisateurs potentiels afin que vous deviez retarder le démarrage du script pour permettre à vos utilisateurs de lire le message, qui expliquera ce que votre script fera avant il commence à exécuter d’autres commandes Bash. La commande sleep de Bash peut vous aider à y parvenir, détaillée ici. Sa syntaxe est la suivante :

sleep n

Où, n est le nombre de secondes que vous souhaitez qu’il attende. n peut également être exprimé en unités plus petites, telles que des millisecondes, simplement en spécifiant le nombre sous forme de nombre décimal - donc si vous souhaitez faire une pause de 30 millisecondes, sleep 0.030 devrait faire l’affaire !

Gardez à l’esprit que n est un argument obligatoire, donc ne pas indiquer à sleep la durée de la pause ne fonctionnerait pas vraiment. Une exécution sans valeur pour n produirait l’erreur suivante.

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

Si vous voulez attendre plus longtemps que quelques secondes, sleep accepte aussi des arguments spécifiant l’unité de temps (i.e. minutes, heures, jours), donc si vous voulez attendre une semaine entière, sleep 7d est votre solution !

Voici quelques cas d’utilisation de sleep.

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

Pour afficher un message et attendre 1 minute :

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

Réexécuter un script pour tuer les processus Python de longue durée chaque semaine.

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

Suspendre le script bash pendant une durée variable

Dans certains cas, vous souhaitez attendre une durée variable, probablement parce que vous souhaitez exécuter le script avec des délais variables en fonction du nombre de scripts en cours d’exécution. Un bon exemple est que si vous exécutez plusieurs fois le même script qui peut avoir besoin de modifier le même fichier, chaque invocation du script aura besoin d’un délai différent pour s’assurer que deux invocations ne modifient pas le fichier simultanément.

Dans ce cas, vous pouvez faire de n une véritable variable de style Bash, $N, et définir sa valeur à un moment donné dans le script. Un exemple est le suivant :

N=5
sleep $N

Le script dans lequel ceci est placé devrait dormir pendant 5 secondes.

Si vous omettez l’initialisation pour $N et spécifiez à la place la valeur lorsque vous appelez le script, vous pouvez utiliser la valeur de $N définie dans l’environnement shell pour fournir la période de temps sleep au 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

En conséquence, vous devriez voir le script s’exécuter pendant 3 secondes. Vous pouvez même remplacer la valeur de l’environnement et la spécifier dans l’invocation du script en faisant N=2 ./test.sh.

Vous pouvez même envisager de randomiser la durée du délai en utilisant $RANDOM comme argument pour sleep à la place - ainsi, vous pouvez dire sleep $RANDOM.

Si la plage de valeurs de $RANDOM est trop grande pour vous, l’application d’une opération de module avec une valeur ajoutée facultative pour assurer un délai minimum devrait vous permettre de dormir pendant une plage de secondes. Par exemple, pour dormir pendant un certain temps, entre 10 et 30 secondes, vous pourriez faire :

sleep $((10 + RANDOM % 21))

Suspendre le script bash jusqu’à ce que l’entrée de l’utilisateur se produise

Parfois, attendre un certain temps ne suffira pas - vous voudrez peut-être vous assurer que l’utilisateur a lu votre message de bienvenue et/ou est prêt à commencer à exécuter votre script. Dans ce cas, vous voulez attendre qu’ils tapent quelque chose pour indiquer qu’ils sont prêts à commencer.

Pour cela, nous utiliserons la commande read, détaillée ici. read attendra que les données soient entrées sur l’entrée standard - la ligne de commande dans laquelle vous tapez les commandes pourrait être appelée l’entrée standard - et une touche Entrée finale signale à la commande que les données ont été entrées. La chaîne peut ensuite être placée dans une variable ou simplement ignorée, ce qui est le cas d’utilisation que nous allons considérer ici.

L’invocation la plus simple de read ne nécessite aucun argument :

read 

Cela devrait entraîner l’impression d’une nouvelle ligne, dans laquelle vous tapez quelque chose. Appuyer sur Entrée devrait vous renvoyer à l’invite Bash, indépendamment de ce que vous avez tapé précédemment.

Combinez des pauses chronométrées avec des pauses saisies par l’utilisateur

Un excellent cas d’utilisation qui vous obligerait à combiner des pauses temporisées avec des pauses d’entrée utilisateur consiste à vous assurer que vous souhaitez que votre script continue à s’exécuter si l’utilisateur ne répond pas, et il n’est pas important qu’il le fasse. La commande read nous permet de le faire en spécifiant un paramètre -t, qui prend plusieurs secondes pour que la commande attende avant d’expirer si la touche Enter n’est pas enfoncée. Il serait utilisé comme suit.

read -t 5

Par conséquent, read s’arrêtera lorsque la touche Entrée est enfoncée ou si 5 secondes se sont écoulées, selon la première éventualité.

Un autre cas d’utilisation serait d’attendre un laps de temps spécifié par l’utilisateur lui-même. Dans ce cas, vous pouvez attendre que l’utilisateur saisisse une valeur entière, puis la passer comme argument à sleep, comme suit.

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

Bien sûr, ceci est sous l’hypothèse que l’utilisateur entrerait un argument valide pour sleep.

Récapitulons avec quelques exemples !

  • sleep 3 mettra un script en pause pendant exactement 3 secondes.
  • sleep 3d mettra un script en pause pendant exactement 3 jours.
  • sleep $N mettra un script en pause pendant le nombre de secondes spécifié comme $N.
  • sleep $((10 + RANDOM % 21)) dormira pendant une période de temps aléatoire dans les 10 à 30 secondes.
  • read attend que l’utilisateur saisisse quelque chose.
  • read -t 3 attend que l’utilisateur saisisse quelque chose mais expire à 3 secondes si la touche Entrée n’est jamais enfoncée.
  • read $time && sleep $time prendra un argument de chaîne de l’utilisateur et l’utilisera comme argument pour sleep, permettant à l’utilisateur de spécifier combien de temps il doit dormir.