
wait
è un comando che attende il completamento dei lavori indicati e restituisce lo stato di uscita del comando atteso.
Dal momento che wait
comando influisce sull'ambiente di esecuzione della shell corrente, è implementato come comando integrato nella maggior parte delle shell.
In questo articolo, esploreremo il wait
integrato in Bash comando.
Bash wait
Comando #
La sintassi generale di wait
built-in assume la forma seguente:
wait [options] ID
ID
è l'ID processo o lavoro. Se nessun ID
è specificato, il comando attende il completamento di tutti i processi secondari in background.
L'wait
command restituisce lo stato di uscita dell'ultimo comando atteso.
Ad esempio, per attendere un processo in background con PID 7654
, useresti:
wait 7654
Quando vengono forniti più processi, il comando attende il completamento di tutti i processi.
I lavori vengono specificati utilizzando la specifica del lavoro ("jobspec"), che è un modo per fare riferimento ai processi che compongono il lavoro. Una specifica del lavoro inizia con un simbolo di percentuale seguito dal numero del lavoro (%n
). Ecco un esempio:
Esegui un comando in background:
rsync -a /home /tmp/home &
L'ID del lavoro shell (racchiuso tra parentesi) e l'ID del processo verranno visualizzati sul tuo terminale:
[2] 54377
Per attendere il lavoro, esegui wait
comando seguito dalla specifica del lavoro:
wait %2
Quando viene invocato con -n
opzione, il comando attende solo il completamento di un singolo lavoro dai pid o dalle specifiche del lavoro forniti e restituisce il suo stato di uscita. Se non vengono forniti argomenti, wait -n
attende il completamento di qualsiasi processo in background e restituisce lo stato di uscita del processo.
wait -n 45432 54346 76573
Nell'esempio sopra, wait -n
stampa solo lo stato di ritorno del lavoro che esce per primo; non mostra il PID del lavoro. Se vuoi ottenere il job pid o jobspec per il quale viene restituito lo stato di uscita, usa il -p
opzione per assegnarlo a una variabile:
wait -p job_id -n 45432 54346 76573
-p
opzione è stata introdotta in Bash 5.1. Se utilizzi una versione precedente di Bash, riceverai un errore di "opzione non valida".
Il -f
l'opzione dice wait
attendere che ogni pid o jobspec termini effettivamente prima di restituire il codice di uscita, anziché restituire quando lo stato del lavoro viene modificato. Questa opzione è valida solo quando il controllo del lavoro è abilitato. Per impostazione predefinita, il controllo dei lavori è abilitato solo per i prompt interattivi.
Esempi #
wait
viene in genere utilizzato negli script di shell che generano processi figlio che vengono eseguiti in parallelo.
Per illustrare come funziona il comando, crea il seguente script:
#!/bin/bash
sleep 30 &
process_id=$!
echo "PID: $process_id"
wait $process_id
echo "Exit status: $?"
Spieghiamo il codice riga per riga:
- La prima riga si chiama shebang e dice al sistema operativo quale interprete utilizzare per analizzare il resto del file.
- Stiamo usando il
sleep
comando per emulare un lungo processo in background. $!
è una variabile Bash interna che memorizza il PID dell'ultimo lavoro eseguito in background. In questo esempio, questo è il PID delsleep
comando. Stiamo archiviando il PID in una variabile (process_id
).- Stampa il numero PID.
- Il PID viene passato a
wait
comando che attende fino alsleep
comando completato. - Stampa lo stato di uscita di
wait
comando.$?
è una variabile Bash interna che mantiene lo stato di uscita dell'ultimo comando eseguito.
Se esegui lo script, verrà stampato qualcosa del genere:
PID: 36353
Exit status: 0
Ecco un esempio usando -n
opzione:
#!/bin/bash
sleep 3 &
sleep 30 &
sleep 5 &
wait -n
echo "First job completed."
wait
echo "All jobs completed."
Quando lo script viene eseguito, genera 3 processi in background. wait -n
attende il completamento del primo lavoro e la stampa dell'istruzione echo. wait
attende il completamento di tutti i lavori in background figlio.
first job completed
all jobs completed
L'ultimo esempio spiega il -f
opzione. Apri il terminale ed esegui:
sleep 3600 &
[1] 46671
Attendi il processo:
wait 46671
Apri un altro terminale e interrompi il processo con kill
comando:
kill -STOP 46671
Una volta modificato lo stato del processo, wait
il comando verrà completato e restituirà il codice di uscita del processo.
Ora, ripeti gli stessi passaggi, ma questa volta usa wait -f $pid
:
sleep 3600 &
wait -f 46671
Interrompi il processo dall'altro terminale:
kill -STOP 46671
Questa volta il wait
il comando non verrà completato. Funzionerà fino al sleep
il processo termina.
Conclusione #
L'wait
il comando attende il completamento dei lavori specificati e restituisce il codice di uscita del lavoro.