vente
er en kommando, der venter på, at de givne job skal fuldføres, og returnerer afslutningsstatus for den ventede på kommando.
Siden den vente
kommando påvirker det aktuelle shell-eksekveringsmiljø, det implementeres som en indbygget kommando i de fleste skaller.
I denne artikel udforsker vi den indbyggede Bash vente
kommando.
Bash vente
Kommando #
Den generelle syntaks for vente
indbygget tager følgende form:
vent [option] ID
ID
er proces- eller job-id'et. Hvis nej ID
er angivet, venter kommandoen, indtil alle underordnede baggrundsjob er afsluttet.
Det vente
kommando returnerer exitstatus for den sidste kommando, du har ventet på.
For eksempel at vente på en baggrundsproces med PID 7654
, du ville bruge:
vent 7654
Når der gives flere processer, venter kommandoen på, at alle processer er afsluttet.
Job specificeres ved hjælp af jobspecifikationen (“jobspec”), som er en måde at henvise til de processer, der udgør jobbet. En jobspec starter med et procentsymbol efterfulgt af jobnummeret (% n
). Her er et eksempel:
Kør en kommando i en baggrund:
rsync -a / home / tmp / home &
Shell-job-id'et (omgivet af parenteser) og proces-id'et vises på din terminal:
[2] 54377
For at vente på jobbet skal du køre vente
kommando efterfulgt af jobspecifikationen:
vent% 2
Når påberåbt sig med -n
valgmulighed, venter kommandoen kun på et enkelt job fra de givne pids eller jobspecs til at fuldføre og returnerer sin exitstatus. Hvis der ikke gives argumenter, vent -n
venter på, at ethvert baggrundsjob skal fuldføre og returnere jobafslutningsstatus.
vent -n 45432 54346 76573
I eksemplet ovenfor, vent -n
udskriver kun returstatus for det job, der afsluttes først; det viser ikke PID for jobbet. Hvis du vil hente job-pid eller jobspec, som exit-status returneres for, skal du bruge -s
mulighed for at tildele den til en variabel:
vent -p job_id -n 45432 54346 76573
-s
option blev introduceret i Bash 5.1. Hvis du bruger en ældre Bash-version, får du en fejl "ugyldig mulighed".
Det -f
indstilling fortæller vente
at vente på, at hver pid eller jobspecifikation faktisk ophører, før den returnerer sin exitkode, snarere end at vende tilbage, når jobstatus ændres. Denne indstilling er kun gyldig, når jobkontrol er aktiveret. Jobkontrol er som standard kun aktiveret for interaktive meddelelser.
Eksempler #
vente
bruges typisk i shell-scripts, der gyder børns processer, der udføres parallelt.
For at illustrere, hvordan kommandoen fungerer, skal du oprette følgende script:
#!/ bin / bash sleep 30 & process_id = $! ekko "PID: $ process_id" vent $ process_id echo "Afslut status: $?"
Lad os forklare koden linje for linje:
- Den første linje kaldes shebang og fortæller operativsystemet, hvilken tolk der skal bruges til at analysere resten af filen.
- Vi bruger
søvn
kommando til at efterligne en tidskrævende baggrundsproces. $!
er en intern Bash-variabel, der gemmer PID for det sidste job, der køres i baggrunden. I dette eksempel er det PID forsøvn
kommando. Vi lagrer PID i en variabel (proces_id
).- Udskriver PID-nummeret.
- PID sendes til
vente
kommando, der venter tilsøvn
kommandoen fuldføres. - Udskriver exitstatus for
vente
kommando.$?
er en intern Bash-variabel, der indeholder exit-status for den sidste kommando, der blev udført.
Hvis du kører scriptet, udskrives det sådan:
PID: 36353 Udgangsstatus: 0
Her et eksempel ved hjælp af -n
mulighed:
#!/ bin / bash sleep 3 & sleep 30 & sleep 5 & wait -n echo "Første job afsluttet."vent ekko" Alle job er afsluttet."
Når scriptet udføres, giver det 3 baggrundsprocesser. vent -n
venter, indtil det første job er afsluttet, og ekkoerklæringen udskrives. vente
venter på, at alle børnebaggrundsjob skal udføres.
første job afsluttet alle job afsluttet
Det sidste eksempel forklarer -f
mulighed. Åbn terminalen og kør:
sove 3600 &
[1] 46671
Vent på processen:
vent 46671
Åbn en anden terminal, og stop processen med dræbe
kommando:
dræb -STOP 46671
Når processtatus er ændret, vises vente
kommandoen fuldfører og returnerer procesafslutningskoden.
Gentag nu de samme trin, men brug denne gang vent -f $ pid
:
sove 3600 &
vent -f 46671
Stop processen fra den anden terminal:
dræb -STOP 46671
Denne gang vente
kommandoen afsluttes ikke. Det løber indtil søvn
processen afsluttes.
Konklusion #
Det vente
kommandoen venter på, at de angivne job er afsluttet, og returnerer jobkodens udgangskode.
Hvis du har spørgsmål eller feedback, er du velkommen til at efterlade en kommentar.