Bash wait Kommando med eksempler

Vent-kommandoen i Bash er et kraftfuldt værktøj til styring af shell-script-processer. Det bruges primært til at pause udførelsen af ​​et script, indtil den angivne baggrundsproces er afsluttet. Denne kommando er praktisk i scripts, der starter flere baggrundsjob og skal synkronisere deres færdiggørelse, før du fortsætter med yderligere opgaver. Vent-kommandoen kan anvendes på individuelle proces-id'er (PID'er) eller til at vente på alle baggrundsprocesser, der er initieret af den aktuelle shell-session. Ved at bruge wait kan du sikre dig, at dit script kun bevæger sig fremad, når specifikke opgaver er fuldført, hvilket gør dine automatiseringsprocesser mere pålidelige og effektive.

Denne vejledning giver praktiske eksempler på brug af wait-kommandoen i forskellige scenarier, og hjælper dig med at forstå, hvordan du effektivt administrerer baggrundsprocesser i dine Bash-scripts.

Forståelse af Bash wait-kommandoen

Vent-kommandoen i Bash er en indbygget funktion, der stopper udførelsen af ​​den aktuelle shell, indtil de angivne job er afsluttet. Den returnerer derefter udgangsstatus for den kommando, den ventede på. Denne kommando spiller en afgørende rolle i shell-udførelsesmiljøet, og som sådan er den indbygget i de fleste skaller.

Den generelle syntaks for wait-kommandoen er som følger:

wait [ID]

I denne sammenhæng repræsenterer ID processen eller job-id'et. Hvis der ikke er angivet et id, vil vent-kommandoen pauseres, indtil alle underordnede baggrundsjob er afsluttet. Vent-kommandoen returnerer udgangsstatus for den sidste kommando, den ventede på.

For eksempel, for at holde pause i en baggrundsproces med PID 7654, ville du bruge:

wait 7654

Hvis flere processer er angivet, vil vente-kommandoen pause, indtil de er færdige.

Navigering af jobspecifikationer med bash wait-kommando

Jobs specificeres ved hjælp af jobspecifikationen (jobspec), som refererer til de processer, der udgør jobbet. Et jobspec begynder med et procentsymbol efterfulgt af jobnummeret (%n). Her er et eksempel:

rsync -a /home /tmp/home &

Denne kommando kører i baggrunden. Skaljob-id'et (omsluttet i parentes) og proces-id'et vil blive vist på din terminal. For at holde pause for jobbet skal du køre vent-kommandoen efterfulgt af jobspecifikationen:

wait %2

Brug af -n Option med bash wait kommando

Valgmuligheden -n tillader, at wait-kommandoen kun holder pause for et enkelt job fra de givne PID'er eller jobspecifikationer, der skal fuldføres og returnerer dets afslutningsstatus. Hvis der ikke er angivet nogen argumenter, venter vent -n på, at ethvert baggrundsjob er fuldført og returnerer jobafslutningsstatus.

wait -n 45432 54346 76573

I eksemplet ovenfor udskriver wait -n kun returneringsstatussen for det job, der afsluttes først; det viser ikke jobbets PID. Hvis du ønsker at få job-PID eller jobspec, som afslutningsstatus returneres for, skal du bruge -p mulighed for at tildele den til en variabel:

wait -p job_id -n 45432 54346 76573

Muligheden -p blev introduceret i Bash 5.1. Brug af en ældre Bash-version vil resultere i en "ugyldig indstilling"-fejl.

Udforsker -f-indstillingen med bash wait-kommandoen

Valgmuligheden -f instruerer at vente med at holde pause for hver PID eller jobspec for at afslutte, før den returnerer dens afslutningskode i stedet for at vende tilbage, når jobstatus ændres. Denne indstilling er kun gyldig, når jobkontrol er aktiveret, hvilket som standard kun er aktiveret for interaktive prompter.

Praktiske eksempler på ventekommandoen

wait-kommandoen bruges typisk i shell-scripts, der afføder underordnede processer, der udføres parallelt. For at illustrere, hvordan kommandoen virker, lad os oprette følgende script:

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

Lad os nedbryde koden linje for linje:

  • Den første linje, shebang, fortæller operativsystemet, hvilken tolk der skal bruges til at analysere resten af ​​filen.
  • Vi bruger sleep-kommandoen til at efterligne en tidskrævende baggrundsproces.
  • $! er en intern Bash-variabel, der gemmer PID'et for det sidste job, der blev kørt i baggrunden. I dette eksempel er det PID for sleep-kommandoen. Vi gemmer PID'et i en variabel (proces_id).
  • PID-nummeret udskrives.
  • PID'en videregives til ventekommandoen, der holder pause, indtil dvalekommandoen er fuldført.
  • Afslutningsstatus for ventekommandoen udskrives. $? er en intern Bash-variabel, der holder exit-statussen for den sidst udførte kommando.

Hvis du kører scriptet, vil det udskrive noget som dette:

PID: 36353
Exit status: 0

Her er et eksempel, der bruger -n muligheden:

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

Når scriptet udføres, afføder det 3 baggrundsprocesser. wait -n holder pause, indtil det første job er afsluttet, og ekkosætningen udskrives. vente pauser på, at alle børnebaggrundsjob er fuldført.

First job completed.
All jobs completed.

Det sidste eksempel forklarer -f muligheden. Åbn terminalen og kør:

sleep 3600 &
[1] 46671
wait 46671

Åbn en anden terminal og stop processen med kill-kommandoen:

kill -STOP 46671

Når processtatus ændres, vil ventekommandoen blive fuldført, og procesafslutningskoden vil blive returneret.

Gentag nu de samme trin, men denne gang skal du bruge wait -f $pid:

sleep 3600 &
wait -f 46671

Stop processen fra den anden terminal:

kill -STOP 46671

Denne gang vil ventekommandoen ikke være fuldført. Den kører, indtil dvaleprocessen afsluttes.

Avanceret brug af wait-kommandoen

Vent-kommandoen bliver særlig nyttig, når du administrerer flere processer i et script. Det giver dig mulighed for at kontrollere eksekveringsflowet og sikre, at specifikke processer er afsluttet, før andre begynder. Lad os dykke ned i nogle mere komplekse eksempler for at illustrere dette.

Bash-vent på flere processer

Overvej et scenarie, hvor flere processer kører i baggrunden, og du skal først handle efter at have fuldført dem. Sådan kan du bruge wait-kommandoen til at opnå dette:

#!/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."

Dette script starter tre baggrundsprocesser, der hviler i henholdsvis 10, 15 og 20 sekunder. Vi gemmer hver process PID i en variabel. Derefter bruger vi wait-kommandoen med alle tre PID'er som argumenter. Scriptet pauser ved vente-kommandoen, indtil alle tre processer er afsluttet.

Brug af Bash vent med en løkke

Du kan også bruge vent med en løkke til at administrere flere processer. Her er et eksempel:

#!/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."

I dette script starter vi fem baggrundsprocesser i en loop. Hver proces sover i flere sekunder svarende til dens indeks i løkken. Vi gemmer hver process PID i et array. Efter at have startet alle processerne, går vi gennem arrayet og bruger wait-kommandoen til at pause hver proces individuelt. Scriptet pauser ved hver ventekommando, indtil den tilsvarende proces er fuldført.

Konklusion

Vent-kommandoen i Bash er vigtig for at synkronisere baggrundsprocesser i dine scripts. Ved at forstå, hvordan du bruger wait, kan du styre flowet af dit script mere præcist og sikre, at opgaverne udføres i den ønskede rækkefølge. Uanset om du har at gøre med flere baggrundsjob eller skal sikre, at en specifik proces afsluttes, før du fortsætter, kan vente-kommandoen hjælpe dig med at opnå mere pålidelig og forudsigelig scriptadfærd. Overvej at integrere wait i dine scripts for at forbedre processtyringen og forbedre den samlede scripteffektivitet.

Joshua James
Følg mig
Seneste indlæg af Joshua James (se alt)

Skriv en kommentar