Commande Bash wait avec exemples

La commande wait de Bash est un outil puissant pour gérer les processus de script shell. Elle est principalement utilisée pour suspendre l'exécution d'un script jusqu'à ce que le processus d'arrière-plan spécifié soit terminé. Cette commande est pratique dans les scripts qui lancent plusieurs tâches en arrière-plan et doivent synchroniser leur achèvement avant de procéder à d'autres tâches. La commande wait peut être appliquée à des ID de processus individuels (PID) ou pour attendre tous les processus d'arrière-plan lancés par la session shell actuelle. En utilisant wait, vous pouvez vous assurer que votre script n'avance que lorsque des tâches spécifiques sont entièrement terminées, ce qui rend vos processus d'automatisation plus fiables et plus efficaces.

Ce guide fournira des exemples pratiques d'utilisation de la commande wait dans divers scénarios, vous aidant à comprendre comment gérer efficacement les processus en arrière-plan dans vos scripts Bash.

Comprendre la commande Bash wait

La commande wait dans Bash est une fonction intégrée qui arrête l'exécution du shell en cours jusqu'à ce que les tâches spécifiées soient terminées. Il renvoie ensuite l'état de sortie de la commande qu'il attendait. Cette commande joue un rôle crucial dans l’environnement d’exécution du shell et, en tant que telle, elle est intégrée à la plupart des shells.

La syntaxe générale de la commande wait est la suivante :

wait [ID]

Dans ce contexte, ID représente l'ID du processus ou du travail. Si aucun ID n'est spécifié, la commande wait s'interrompt jusqu'à ce que toutes les tâches d'arrière-plan enfants soient terminées. La commande wait renvoie l'état de sortie de la dernière commande qu'elle a attendue.

Par exemple, pour interrompre un processus en arrière-plan avec le PID 7654, vous utiliserez :

wait 7654

Si plusieurs processus sont spécifiés, la commande wait s'arrêtera jusqu'à ce qu'ils soient terminés.

Navigation dans les spécifications de travail avec la commande bash wait

Les tâches sont spécifiées à l'aide de la spécification de tâche (jobspec), qui fait référence aux processus qui composent la tâche. Une spécification de tâche commence par un symbole de pourcentage suivi du numéro de tâche (%n). Voici un exemple :

rsync -a /home /tmp/home &

Cette commande s'exécute en arrière-plan. L’ID du travail shell (entre parenthèses) et l’ID du processus seront affichés sur votre terminal. Pour suspendre le travail, exécutez la commande wait suivie de la spécification du travail :

wait %2

Utilisation de l'option -n avec la commande bash wait

L'option -n permet à la commande wait de s'arrêter uniquement pour qu'un seul travail à partir des PID ou spécifications de travail donnés soit terminé et renvoie son état de sortie. Si aucun argument n'est fourni, wait -n attend la fin d'une tâche en arrière-plan et renvoie l'état de sortie de la tâche.

wait -n 45432 54346 76573

Dans l'exemple ci-dessus, wait -n imprime uniquement l'état de retour du travail qui se termine en premier ; il n'affiche pas le PID du travail. Si vous souhaitez obtenir le PID du travail ou la spécification du travail pour lequel l'état de sortie est renvoyé, utilisez la commande -p option pour l'affecter à une variable :

wait -p job_id -n 45432 54346 76573

L'option -p a été introduite dans Bash 5.1. L'utilisation d'une version antérieure de Bash entraînera une erreur « option non valide ».

Explorer l'option -f avec la commande bash wait

L'option -f demande d'attendre que chaque PID ou spécification de tâche se termine avant de renvoyer son code de sortie plutôt que de le renvoyer lorsque l'état de la tâche est modifié. Cette option n'est valide que lorsque le contrôle des tâches est activé, ce qui est activé par défaut uniquement pour les invites interactives.

Exemples pratiques de la commande wait

La commande wait est généralement utilisée dans les scripts shell qui génèrent des processus enfants qui s'exécutent en parallèle. Pour illustrer le fonctionnement de la commande, créons le script suivant :

#!/bin/bash
sleep 30 &
process_id=$!
echo "PID: $process_id"
wait $process_id
echo "Exit status: $?"

Décomposons le code ligne par ligne :

  • La première ligne, shebang, indique au système d'exploitation quel interpréteur utiliser pour analyser le reste du fichier.
  • Nous utilisons la commande sleep pour émuler un processus d'arrière-plan fastidieux.
  • $! est une variable Bash interne qui stocke le PID du dernier travail exécuté en arrière-plan. Dans cet exemple, il s'agit du PID de la commande sleep. Nous stockons le PID dans une variable (process_id).
  • Le numéro PID est imprimé.
  • Le PID est transmis à la commande wait qui fait une pause jusqu'à la fin de la commande sleep.
  • L'état de sortie de la commande d'attente est imprimé. $? est une variable Bash interne qui contient l'état de sortie de la dernière commande exécutée.

Si vous exécutez le script, il affichera quelque chose comme ceci :

PID: 36353
Exit status: 0

Voici un exemple utilisant l'option -n :

#!/bin/bash
sleep 3 &
sleep 30 &
sleep 5 &
wait -n
echo "First job completed."
wait
echo "All jobs completed."

Lorsque le script est exécuté, il génère 3 processus en arrière-plan. wait -n fait une pause jusqu'à ce que le premier travail soit terminé et que l'instruction echo soit imprimée. attendez la fin de toutes les tâches enfants en arrière-plan.

First job completed.
All jobs completed.

Le dernier exemple explique l'option -f. Ouvrez le terminal et exécutez :

sleep 3600 &
[1] 46671
wait 46671

Ouvrez un autre terminal et arrêtez le processus avec la commande kill :

kill -STOP 46671

Une fois que l'état du processus change, la commande d'attente sera terminée et le code de sortie du processus sera renvoyé.

Maintenant, répétez les mêmes étapes, mais cette fois-ci, utilisez wait -f $pid :

sleep 3600 &
wait -f 46671

Arrêtez le processus depuis l'autre terminal :

kill -STOP 46671

Cette fois, la commande wait ne sera pas terminée. Elle s'exécutera jusqu'à ce que le processus sleep se termine.

Utilisation avancée de la commande wait

La commande wait devient particulièrement utile lors de la gestion de plusieurs processus dans un script. Elle vous permet de contrôler le flux d'exécution et de vous assurer que des processus spécifiques sont terminés avant que d'autres ne commencent. Examinons quelques exemples plus complexes pour illustrer cela.

Bash attend plusieurs processus

Imaginez un scénario dans lequel plusieurs processus s'exécutent en arrière-plan et vous ne devez agir qu'après les avoir terminés. Voici comment vous pouvez utiliser la commande wait pour y parvenir :

#!/bin/bash
echo "Starting process 1..."
sleep 10 &
pid1=$!

echo "Starting process 2..."
sleep 15 &
pid2=$!

echo "Starting process 3..."
sleep 20 &
pid3=$!

echo "Waiting for processes to complete..."
wait $pid1 $pid2 $pid3
echo "All processes completed."

Ce script démarre trois processus en arrière-plan qui dorment respectivement pendant 10, 15 et 20 secondes. Nous stockons le PID de chaque processus dans une variable. Ensuite, nous utilisons la commande wait avec les trois PID comme arguments. Le script s'arrêtera à la commande wait jusqu'à ce que les trois processus soient terminés.

Utiliser Bash attendre avec une boucle

Vous pouvez également utiliser wait avec une boucle pour gérer plusieurs processus. Voici un exemple :

#!/bin/bash
for i in {1..5}
do
   echo "Starting process $i..."
   sleep $i &
   pids[${i}]=$!
done

echo "Waiting for processes to complete..."
for pid in ${pids[*]}; do
    wait $pid
done

echo "All processes completed."

Dans ce script, nous démarrons cinq processus en arrière-plan dans une boucle. Chaque processus dort pendant plusieurs secondes égales à son index dans la boucle. Nous stockons le PID de chaque processus dans un tableau. Après avoir démarré tous les processus, nous parcourons le tableau et utilisons la commande wait pour mettre en pause chaque processus individuellement. Le script fera une pause à chaque commande d'attente jusqu'à ce que le processus correspondant soit terminé.

Conclusion

La commande wait de Bash est essentielle pour synchroniser les processus d'arrière-plan dans vos scripts. En comprenant comment utiliser wait, vous pouvez contrôler le flux de votre script avec plus de précision, en vous assurant que les tâches sont terminées dans l'ordre souhaité. Que vous ayez affaire à plusieurs tâches en arrière-plan ou que vous deviez vous assurer qu'un processus spécifique se termine avant de continuer, la commande wait peut vous aider à obtenir un comportement de script plus fiable et prévisible. Pensez à intégrer wait dans vos scripts pour améliorer la gestion des processus et améliorer l'efficacité globale des scripts.

Joshua James
Suis-moi
Les derniers articles par Joshua James (tout voir)

Laissez un commentaire