wacht
is een opdracht die wacht tot de opgegeven taken zijn voltooid en de uitgangsstatus van de opdracht wacht op terugkeert.
sinds de wacht
commando beïnvloedt de huidige uitvoeringsomgeving van de shell, het is geïmplementeerd als een ingebouwd commando in de meeste shells.
In dit artikel onderzoeken we de ingebouwde Bash wacht
opdracht.
bash wacht
Commando #
De algemene syntaxis van de wacht
ingebouwd heeft de volgende vorm:
wacht [opties] ID
ID kaart
is het proces- of taak-ID. Als Nee ID kaart
is opgegeven, wacht de opdracht totdat alle onderliggende achtergrondtaken zijn voltooid.
De wacht
commando geeft de afsluitstatus van het laatste commando waarop is gewacht.
Bijvoorbeeld om te wachten op een achtergrondproces met PID 7654
, je zou gebruiken:
wacht 7654
Wanneer meerdere processen worden gegeven, wacht de opdracht totdat alle processen zijn voltooid.
Taken worden gespecificeerd met behulp van de taakspecificatie ("jobspec"), wat een manier is om te verwijzen naar de processen waaruit de taak bestaat. Een jobspec begint met een percentagesymbool gevolgd door het jobnummer (%n
). Hier is een voorbeeld:
Voer een opdracht op een achtergrond uit:
rsync -a /home /tmp/home &
De shell-taak-ID (omgeven door haakjes) en proces-ID worden op uw terminal weergegeven:
[2] 54377
Om op de taak te wachten, voert u de wacht
commando gevolgd door de taakspecificatie:
wacht %2
Wanneer aangeroepen met de -nee
optie, de opdracht wacht slechts op een enkele taak van de gegeven pids of jobspecs om te voltooien en geeft de exit-status terug. Als er geen argumenten worden gegeven, wacht -n
wacht tot een achtergrondtaak is voltooid en de status voor het verlaten van de taak wordt geretourneerd.
wacht -n 45432 54346 76573
In het bovenstaande voorbeeld, wacht -n
drukt alleen de retourstatus af van de taak die als eerste wordt afgesloten; het toont niet de PID van de taak. Als u de job-pid of jobspec wilt krijgen waarvoor de exit-status wordt geretourneerd, gebruikt u de -p
optie om het toe te wijzen aan een variabele:
wacht -p job_id -n 45432 54346 76573
-p
optie werd geïntroduceerd in Bash 5.1. Als je een oudere Bash-versie gebruikt, krijg je de foutmelding 'ongeldige optie'.
De -f
optie vertelt wacht
om te wachten tot elke pid of jobspec daadwerkelijk wordt beëindigd voordat de afsluitcode wordt geretourneerd, in plaats van terug te keren wanneer de taakstatus wordt gewijzigd. Deze optie is alleen geldig wanneer taakbeheer is ingeschakeld. Taakbeheer is standaard alleen ingeschakeld voor interactieve prompts.
Voorbeelden #
wacht
wordt meestal gebruikt in shellscripts die onderliggende processen voortbrengen die parallel worden uitgevoerd.
Maak het volgende script om te illustreren hoe de opdracht werkt:
#!/bin/bash slaap 30 & process_id=$! echo "PID: $process_id" wacht $process_id echo "Verlaat status: $?"
Laten we de code regel voor regel uitleggen:
- De eerste regel heet shebang en vertelt het besturingssysteem welke interpreter moet worden gebruikt om de rest van het bestand te ontleden.
- We gebruiken de
slaap
commando om een tijdrovend achtergrondproces te emuleren. $!
is een interne Bash-variabele die de PID van de laatste taak op de achtergrond opslaat. In dit voorbeeld is dat de PID van deslaap
opdracht. We slaan de PID op in een variabele (process_id
).- Drukt het PID-nummer af.
- De PID wordt doorgegeven aan de
wacht
commando dat wacht tot deslaap
opdracht is voltooid. - Drukt de uitgangsstatus af van de
wacht
opdracht.$?
is een interne Bash-variabele die de exit-status van de laatst uitgevoerde opdracht bevat.
Als u het script uitvoert, wordt er zoiets als dit afgedrukt:
PID: 36353 Verlaatstatus: 0
Hier een voorbeeld met de -nee
keuze:
#!/bin/bash slaap 3 & slaap 30 & slaap 5 & wacht -n echo "Eerste taak voltooid." wait echo "Alle taken voltooid."
Wanneer het script wordt uitgevoerd, spawnt het 3 achtergrondprocessen. wacht -n
wacht tot de eerste taak is voltooid en het echo-statement is afgedrukt. wacht
wacht tot alle achtergrondtaken voor kinderen zijn voltooid.
eerste taak voltooid alle taken voltooid
Het laatste voorbeeld verklaart de -f
keuze. Open de terminal en voer uit:
slaap 3600 &
[1] 46671
Wacht op het proces:
wacht 46671
Open een andere terminal en stop het proces met de doden
opdracht:
doden -STOP 46671
Zodra de processtatus is gewijzigd, wordt de wacht
commando wordt voltooid en retourneert de exit-code van het proces.
Herhaal nu dezelfde stappen, maar gebruik deze keer wacht -f $pid
:
slaap 3600 &
wacht -f 46671
Stop het proces vanaf de andere terminal:
doden -STOP 46671
Deze keer de wacht
opdracht wordt niet voltooid. Het loopt tot de slaap
proces eindigt.
Conclusie #
De wacht
opdracht wacht tot de opgegeven taken zijn voltooid en retourneert de afsluitcode van de taak.
Als je vragen of feedback hebt, laat dan gerust een reactie achter.