Lo script della shell attende il comando in background

Sto scrivendo uno script, ma cè qualcosa di cui ho bisogno che non riesco a trovare un modo per farlo …

Devo creare un comando in background “command1 &” e poi da qualche parte nello script devo aspettare che finisca prima di eseguire command2. Fondamentalmente , Ho bisogno di questo:

NOTA: ogni comando viene eseguito in una directory specifica! Alla fine del ciclo while il mio comando1 ha creato 4 directory, dove in ognuna viene eseguito il processo specifico quindi il totale del processo in esecuzione sono 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  

Ho “visto qualcosa su un wait con il numero di processo pid, ma anche questo non ha funzionato.

Commenti

  • Sei tu a controllare command1? Puoi modificarlo in modo che restituisca i PID dei 4 processi?
  • Sì! ce lho già 🙂
  • Ho aggiornato di conseguenza la mia risposta. Dimmi se corrisponde alle tue aspettative.
  • Questa domanda è correlata a questa: unix.stackexchange.com/questions/100801/… . Lunica differenza è che devi ottenere il PID da un processo in background. Puoi utilizzare la variabile $! per ottenerla, passandola al comando wait come mostrato qui. $! contiene lultimo PID in background, mentre $$ contiene lultimo processo eseguito ' il PID .
  • OK, ora il tuo script non ha alcun senso. Ci sono errori di sintassi e stranezze ovunque. Puoi mostrarci lo script effettivo ? Perché stai cercando i comandi? Perché non eseguirli semplicemente?

Risposta

Puoi utilizzare il comando wait PID per attendere la fine di un processo.

Puoi anche recuperare il PID dellultimo comando con $!

In nel tuo caso, qualcosa del genere funzionerebbe:

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 

Dopo la tua modifica, poiché hai più PID e li conosci, puoi farlo:

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 

Commenti

  • Dopo la modifica, se conosci il PID creato (xxxxx, yyyyy, xxyyy, yyxxx ), puoi usare anche wait, con lelenco dei PID da aspettare (vedi man). Se ' non li conosci, forse puoi raccoglierli in command1 (cosè command1? Un tuo script?)
  • Probabilmente è meglio assicurarti che ' sono raggruppati correttamente in primo luogo. Vedi la mia risposta per avere unidea di come potrebbe essere fatto.

Rispondi

Il modo più pulito per farlo sarebbe che il tuo comamnd1 restituisse i PID dei processi avviati utilizzando wait su ciascuno di essi come suggerito da @LaurentC “s answer .

Un altro approccio potrebbe essere qualcosa del genere:

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

Commenti

  • scusa ma continuo a non funzionare .. Migliorerò ancora una volta la mia domanda!

Risposta

Se utilizzi il seguente metodo, potresti non aver bisogno di una speciale “attesa per tutti i processi” dopo il ciclo while. Il ciclo attenderà lattuale command1 per completare prima che torni allinizio. Fai attenzione come per qualsiasi consiglio. Tieni presente che lunica cosa che ho fatto è stata aggiungere & wait $! alla fine del tuo command1.

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *