O comando wait
, sem especificações adicionais, irá esperar pelo final de todos os processos-filhos ativos . Isso significa que se houvesse outro processo também, ele aguardaria o fim do último que terminaria.
O Wait pode ser chamado especificando um ID : com o ID é possível passar ou o PID (ID do processo) ou a especificação do trabalho . Além disso, se não fosse um único comando, mas um pipe, wait
aguardará o final do pipeline completo (veja abaixo).
Portanto, com wait 7165
, ele aguardará o final do processo com o ID 7165, com wait %2
do trabalho [2]
.
Em um script, você pode armazenar o PID do último trabalho enviado usando a variável $!
; você precisa armazenar esse valor porque ele será atualizado após cada execução de comando.
#!/bin/bash
...
command1 & # Another command in background job [1]
command2 && command2b && command2c & # The command in background job [2]
PID_CMD1=$! # Store the PID of the last job, job [2]
some_other_commands # ...
# With this command you will
wait # block all until command0 and all
# the pipe of command1 are completed or...
wait $PID_CMD1 # With this command you will wait only the end
# of command1 pipeline or...
wait %2 # With this command you'll wait the end of job [2]
# Note that if the command 1 fails or is really fast
# you can have for the command 2 the job ID 1
command3 & # job [1] again! it's possible to recycle the numbers
command4 & # job [2]
De man bash
:
The shell associates a job with each pipeline. It keeps a table of currently executing jobs, which may be listed with the jobs command. When bash starts a job asynchronously (in the background), it prints a line that looks like:
[1] 25647
indicating that this job is job number 1 and that the process ID of the last process in the pipeline associated with this job is 25647. All of the processes in a single pipeline are members of the same job. Bash uses the job abstraction as the basis for job control...
Você pode ler mais sobre como esperar com help wait
.