wait
est une commande qui attend la fin des travaux donnés et renvoie l'état de sortie de la commande attendue.
Depuis le wait
affecte l'environnement d'exécution actuel du shell, elle est implémentée en tant que commande intégrée dans la plupart des shells.
Dans cet article, nous allons explorer le wait
intégré à Bash commande.
Bash wait
Commande #
La syntaxe générale du wait
intégré prend la forme suivante :
wait [options] ID
ID
est l'ID du processus ou de la tâche. Si aucun ID
est spécifié, la commande attend que toutes les tâches d'arrière-plan enfants soient terminées.
Le wait
commande renvoie l'état de sortie de la dernière commande attendue.
Par exemple, pour attendre un processus en arrière-plan avec le PID 7654
, vous utiliseriez :
wait 7654
Lorsque plusieurs processus sont donnés, la commande attend que tous les processus soient terminés.
Les travaux sont spécifiés à l'aide de la spécification de travail ("jobspec"), qui est un moyen de se référer aux processus qui composent le travail. Une spécification de travail commence par un symbole de pourcentage suivi du numéro de travail (%n
). Voici un exemple :
Exécutez une commande en arrière-plan :
rsync -a /home /tmp/home &
L'ID de tâche shell (entouré de crochets) et l'ID de processus s'afficheront sur votre terminal :
[2] 54377
Pour attendre le travail, exécutez le wait
commande suivie de la spécification du travail :
wait %2
Lorsqu'il est invoqué avec le -n
option, la commande n'attend qu'un seul travail à partir des pid ou des spécifications de travail donnés pour se terminer 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 sort en premier ; il ne montre pas le PID du travail. Si vous souhaitez obtenir le pid ou la spécification de travail pour lequel le statut de sortie est renvoyé, utilisez le -p
possibilité de l'affecter à une variable :
wait -p job_id -n 45432 54346 76573
-p
L'option a été introduite dans Bash 5.1. Si vous utilisez une ancienne version de Bash, vous obtiendrez une erreur "option non valide".
Le -f
l'option indique wait
d'attendre que chaque pid ou jobspec se termine réellement avant de renvoyer son code de sortie, plutôt que de revenir lorsque l'état du travail est modifié. Cette option n'est valide que lorsque le contrôle des travaux est activé. Par défaut, le contrôle des tâches est activé uniquement pour les invites interactives.
Exemples #
wait
est généralement utilisé 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éez le script suivant :
#!/bin/bash
sleep 30 &
process_id=$!
echo "PID: $process_id"
wait $process_id
echo "Exit status: $?"
Expliquons le code ligne par ligne :
- La première ligne s'appelle shebang et indique au système d'exploitation quel interpréteur utiliser pour analyser le reste du fichier.
- Nous utilisons le
sleep
commande pour émuler un processus d'arrière-plan chronophage. $!
est une variable Bash interne qui stocke le PID de la dernière tâche exécutée en arrière-plan. Dans cet exemple, c'est le PID dusleep
commande. Nous stockons le PID dans une variable (process_id
).- Imprime le numéro PID.
- Le PID est passé au
wait
commande qui attend jusqu'à ce quesleep
la commande se termine. - Imprime le statut de sortie de l'
wait
commande.$?
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 le -n
choix :
#!/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 d'arrière-plan. wait -n
attend que le premier travail soit terminé et que l'instruction echo soit imprimée. wait
attend que toutes les tâches d'arrière-plan enfants soient terminées.
first job completed
all jobs completed
Le dernier exemple explique le -f
option. Ouvrez le terminal et exécutez :
sleep 3600 &
[1] 46671
Attendez le processus :
wait 46671
Ouvrez un autre terminal et arrêtez le processus avec le kill
commande :
kill -STOP 46671
Une fois le statut du processus modifié, le message wait
la commande se terminera et renverra le code de sortie du processus.
Maintenant, répétez les mêmes étapes, mais cette fois utilisez wait -f $pid
:
sleep 3600 &
wait -f 46671
Arrêtez le processus depuis l'autre terminal :
kill -STOP 46671
Cette fois, le wait
la commande ne se terminera pas. Il fonctionnera jusqu'à la sleep
le processus se termine.
Conclusion #
Le wait
La commande attend que les tâches spécifiées se terminent et renvoie le code de sortie de la tâche.