Shell-script wacht op achtergrondcommando

Ik schrijf een script, maar er is iets dat ik nodig heb dat ik “geen manier kan vinden om het te doen …

Ik moet een commando maken op de achtergrond “command1 &” en dan ergens in het script moet ik wachten tot het klaar is voordat ik command2 doe. , Ik heb dit nodig:

OPMERKING: elk commando wordt in een specifieke map uitgevoerd! Aan het einde van de while-lus heeft my command1 4 directorys gemaakt, waar in elk het specifieke proces wordt uitgevoerd, zodat het totale proces running are 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  

Ik heb iets gezien over een wait commando met het pid-procesnummer, maar dat werkte ook niet.

Opmerkingen

  • Beheert u command1? Kun je het aanpassen zodat het de PIDs van de 4 processen retourneert?
  • Ja! dat heb ik al 🙂
  • Ik heb mijn antwoord dienovereenkomstig bijgewerkt. Vertel me of het overeenkomt met uw verwachtingen.
  • Deze Q is gerelateerd aan deze: unix.stackexchange.com/questions/100801/… . Het enige verschil is dat u de PID moet halen uit een achtergrondproces. Je kunt de $! variabele gebruiken om dit te krijgen, door het door te geven aan het wait commando, zoals ik daar heb laten zien. $! bevat de laatste PID op de achtergrond, terwijl $$ de laatste procesuitvoering bevat ' s PID .
  • OK, nu heeft uw script helemaal geen zin. Er zijn overal syntaxisfouten en vreemdheid. Kunt u ons het daadwerkelijke script laten zien? Waarom zoekt u opdrachten? Waarom voer je ze niet gewoon uit?

Antwoord

Je kunt het commando wait PID om te wachten tot een proces is beëindigd.

U kunt ook de PID van het laatste commando ophalen met $!

In in jouw geval zou zoiets als dit werken:

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 

Na je bewerking, aangezien je meerdere PIDs hebt en je kent ze, kun je dat doen:

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 

Reacties

  • Na je bewerking, als je de aangemaakte PID kent (xxxxx, yyyyy, xxyyy, yyxxx ), je kunt ook wait gebruiken, met de lijst met PIDs om op te wachten (zie man). Als u ' ontkent, kunt u ze misschien verzamelen in command1 (wat is command1? Een eigen script?)
  • Waarschijnlijk het beste om ervoor te zorgen dat ze ' opnieuw correct gegroepeerd in de eerste plaats. Zie mijn antwoord voor een idee van hoe het kan worden gedaan.

Antwoord

De schoonste manier om dit te doen zou zijn om uw comamnd1 de PIDs van de gestarte processen te laten retourneren en wait op elk ervan te gebruiken, zoals voorgesteld door @LaurentC “s antwoord .

Een andere benadering zou ongeveer zo zijn:

## 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 

Opmerkingen

  • sorry maar het werkt nog steeds niet .. Ik zal mijn vraag nogmaals verbeteren!

Antwoord

Als je de volgende methode gebruikt, heb je misschien geen speciale “wacht op alle processen” nodig na de while-lus. De lus wacht op de huidige command1 om te voltooien voordat het terug naar boven gaat. Wees voorzichtig zoals bij elk advies. Let op, het enige dat ik deed was & wait $! toevoegen aan het einde van uw command1.

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *