Shell-script venter på baggrundskommando

Jeg skriver et script, men der er noget, jeg har brug for, for at jeg ikke kan finde en måde at gøre det på …

Jeg er nødt til at lave en kommando i baggrunden “command1 &” og så et eller andet sted i scriptet skal jeg vente på, at den er færdig, før jeg udfører command2. , Jeg har brug for dette:

BEMÆRK: hver kommando kører i en bestemt mappe! I slutningen af while-sløjfen oprettede min kommando1 4 mapper, hvor i hver enkelt kører den specifikke proces, så den samlede proces kører er 4

 a=1 while [$a -lt 4 ] . command1 #Generates 1 Process a= `export $a +1` done #Wait until the 4 process end and then run the command2 . command2  

Jeg har set noget om en wait kommando med pid-procesnummeret, men det fungerede ikke også.

Kommentarer

  • Kontrollerer du command1? Kan du ændre det, så det returnerer PIDerne for de 4 processer?
  • Ja! Jeg har det allerede 🙂
  • Jeg har opdateret mit svar i overensstemmelse hermed. Fortæl mig, om det matcher dine undtagelser.
  • Denne Q er relateret til denne: unix.stackexchange.com/questions/100801/… . Den eneste forskel er, at du har brug for at få PID fra en baggrundsproces. Du kan bruge $! -variablen til at få dette og videregive det til wait -kommandoen, som jeg viste der. $! indeholder den sidst baggrundte PID, mens $$ indeholder den sidste proceskørsel ' s PID .
  • OK, nu giver dit script slet ikke mening. Der er syntaksfejl og mærkelighed overalt. Kan du vise os det faktiske script? Hvorfor køber du kommandoer? Hvorfor ikke bare udføre dem?

Svar

Du kan bruge kommandoen wait PID for at vente på, at en proces slutter.

Du kan også hente PID for den sidste kommando med $!

I din sag, noget som dette ville virke:

command1 & #run command1 in background PID=$! #catch the last PID, here from command1 command2 #run command2 while command1 is running in background wait $PID #wait for command1, in background, to end command3 #execute once command1 ended 

Efter din redigering, da du har flere PIDer, og du kender dem, kan du gøre det:

command1 & #run command1 in background PID1=xxxxx PID2=yyyyy PID3=xxyyy PID4=yyxxx command2 #run command2 while command1 is running in background wait $PID1 $PID2 $PID3 $PID4 #wait for the four processes of command1, in background, to end command3 #execute once command1 ended 

Kommentarer

  • Efter din redigering, hvis du kender PID oprettet (xxxxx, åååå, xxyyy, yyxxx ), kan du også bruge vent med listen over PIDer, du skal vente på (se mand). Hvis du ikke ' ikke kender dem, kan du måske samle dem i kommando1 (hvad er kommando1? Et eget script?)
  • Sandsynligvis bedst for at sikre, at de ' er grupperet korrekt i første omgang. Se mit svar for en idé om, hvordan det kan gøres.

Svar

Den reneste måde at gøre dette på ville være, at din comamnd1 returnerer PIDerne for de lancerede processer og bruger wait på hver af dem som foreslået af @LaurentC “s svar .

En anden tilgang ville være noget som dette:

## Create a log file logfile=$(mktemp) ## Run your command and have it print into the log file ## when it"s finsihed. command1 && echo 1 > $logfile & ## Wait for it. The [ ! -s $logfile ] is true while the file is ## empty. The -s means "check that the file is NOT empty" so ! -s ## means the opposite, check that the file IS empty. So, since ## the command above will print into the file as soon as it"s finished ## this loop will run as long as the previous command si runnning. while [ ! -s $logfile ]; do sleep 1; done ## continue command2 

Kommentarer

  • undskyld, men fungerer stadig ikke .. Jeg vil forbedre mit spørgsmål igen!

Svar

Hvis du bruger følgende metode, har du muligvis ikke brug for et specielt “vent på alle processer” efter mens loop. Loop venter på den aktuelle command1 for at fuldføre, inden den cykler tilbage til toppen. Vær forsigtig som med ethvert råd. Bemærk, det eneste jeg gjorde var at tilføje & wait $! i slutningen af din command1.

a=1 while [$a -lt 4 ] . command1 & wait $! #Generates 1 Process a= `export $a +1` done 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *