vente
er en kommando som venter på at de gitte jobbene skal fullføres, og returnerer avslutningsstatusen til den ventede på kommandoen.
Siden vente
kommandoen påvirker det gjeldende miljøet for skallutførelse, den er implementert som en innebygd kommando i de fleste skjell.
I denne artikkelen vil vi utforske den innebygde Bash vente
kommando.
Bash vente
Kommando #
Den generelle syntaksen til vente
innebygd tar følgende form:
vent [alternativ] ID
ID
er prosessen eller jobb-IDen. Hvis nei ID
er spesifisert, venter kommandoen til alle bakgrunnsjobber for barn er fullført.
De vente
kommandoen returnerer utgangsstatus for den siste kommandoen som ventet.
For eksempel å vente på en bakgrunnsprosess med PID 7654
, du vil bruke:
vent 7654
Når flere prosesser er gitt, venter kommandoen på at alle prosesser skal fullføres.
Jobber spesifiseres ved hjelp av jobbspesifikasjonen (“jobspec”), som er en måte å referere til prosessene som utgjør jobben. En jobspec begynner med et prosentsymbol etterfulgt av jobbnummeret (% n
). Her er et eksempel:
Kjør en kommando i bakgrunnen:
rsync -a / home / tmp / home &
ID-en for jobbjobben (omgitt av parenteser) og prosess-ID vises på terminalen din:
[2] 54377
For å vente på jobben, kjør vente
kommando etterfulgt av jobbspesifikasjonen:
vent% 2
Når påkalt med -n
alternativet, venter kommandoen bare på en enkelt jobb fra de gitte pidsene eller jobspecs å fullføre og returnerer sin avslutningsstatus. Hvis ingen argumenter blir gitt, vent -n
venter på at en bakgrunnsjobb skal fullføres og returnere statusen for avslutning av jobben.
vent -n 45432 54346 76573
I eksemplet ovenfor, vent -n
skriver bare ut returstatusen til jobben som avsluttes først; det viser ikke PID for jobben. Hvis du vil få jobben pid eller jobspec som utgangsstatusen returneres for, bruker du -s
muligheten til å tilordne den til en variabel:
vent -p jobb_id -n 45432 54346 76573
-s
alternativet ble introdusert i Bash 5.1. Hvis du bruker en eldre Bash-versjon, får du feilmeldingen "ugyldig alternativ".
De -f
alternativet forteller vente
å vente på at hver pid eller jobspec faktisk skal avsluttes før du returnerer utgangskoden, i stedet for å returnere når jobbstatusen endres. Dette alternativet er bare gyldig når jobbkontroll er aktivert. Som standard er jobbkontroll bare aktivert for interaktive instruksjoner.
Eksempler #
vente
brukes vanligvis i skallskripter som gyter barneprosesser som utføres parallelt.
For å illustrere hvordan kommandoen fungerer, opprett følgende skript:
#!/ bin / bash sleep 30 & process_id = $! ekko "PID: $ process_id" vent $ process_id echo "Avslutt status: $?"
La oss forklare koden linje for linje:
- Den første linjen heter shebang og forteller operativsystemet hvilken tolk som skal brukes til å analysere resten av filen.
- Vi bruker
søvn
kommando om å etterligne en tidkrevende bakgrunnsprosess. $!
er en intern Bash-variabel som lagrer PID for den siste jobben som kjøres i bakgrunnen. I dette eksemplet er det PID forsøvn
kommando. Vi lagrer PID i en variabel (prosess_id
).- Skriver ut PID-nummeret.
- PID sendes til
vente
kommando som venter tilsøvn
kommandoen fullføres. - Skriver ut utgangsstatus for
vente
kommando.$?
er en intern Bash-variabel som har utgangsstatus for den siste kommandoen som ble utført.
Hvis du kjører skriptet, vil det skrive ut noe slikt:
PID: 36353 Utgangsstatus: 0
Her et eksempel med -n
alternativ:
#!/ bin / bash sleep 3 & sleep 30 & sleep 5 & wait -n echo "Første jobb fullført."vent ekko" Alle jobber fullført."
Når skriptet kjøres, gyter det tre bakgrunnsprosesser. vent -n
venter til den første jobben er fullført og ekkouttalelsen skrives ut. vente
venter på at alle barnebakgrunnjobber skal fullføres.
første jobb fullført alle fullførte jobber
Det siste eksemplet forklarer -f
alternativ. Åpne terminalen og kjør:
sove 3600 og
[1] 46671
Vent på prosessen:
vent 46671
Åpne en annen terminal og stopp prosessen med drepe
kommando:
drep -STOP 46671
Når prosessstatusen er endret, blir vente
kommandoen vil fullføre og returnere prosessutgangskoden.
Gjenta nå de samme trinnene, men bruk denne gangen vent -f $ pid
:
sove 3600 og
vent -f 46671
Stopp prosessen fra den andre terminalen:
drep -STOP 46671
Denne gangen vente
kommandoen fullføres ikke. Det vil løpe til søvn
prosessen avsluttes.
Konklusjon #
De vente
kommandoen venter på at de angitte jobbene skal fullføres og returnerer avslutningskoden for jobben.
Hvis du har spørsmål eller tilbakemeldinger, er du velkommen til å legge igjen en kommentar.