Estou escrevendo um script, mas há algo de que preciso que não consigo encontrar uma maneira de fazê-lo ...
Preciso fazer um comando em segundo plano "command1 &" e, em algum lugar do script, preciso esperar que ele termine antes de executar o command2. Basicamente, eu preciso disso:
NOTA: cada comando é executado em um diretório específico! no final do loop while, meu command1 criou 4 diretórios, nos quais cada um executa o processo específico, de modo que o total de processos em execução é 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
Eu vi algo sobre um wait
comando com o número do processo pid, mas isso não funcionou também.
shell
scripting
background-process
João Macau
fonte
fonte
command1
? Você pode modificá-lo para que ele retorne os PIDs dos 4 processos?$!
variável para obter isso, passando-a para owait
comando como mostrei lá.$!
contém o último PID em segundo plano, enquanto$$
contém o último PID da execução do processo.Respostas:
Você pode usar o comando
wait PID
para aguardar o término de um processo.Você também pode recuperar o PID do último comando com
$!
No seu caso, algo como isso funcionaria:
Após a sua edição, como você possui vários PIDs e os conhece, você pode fazer isso:
fonte
A maneira mais limpa de fazer isso seria
comamnd1
devolver os PIDs dos processos lançados e usáwait
-los em cada um deles, conforme sugerido pela resposta da @ LaurentC .Outra abordagem seria algo como isto:
fonte
Se você usar o método a seguir, poderá não precisar de uma "espera para todos os processos" especial após o loop while. O loop aguardará
command1
a conclusão da corrente antes de voltar ao topo. Por favor, tenha cuidado como em qualquer conselho. Observe que a única coisa que fiz foi adicionar& wait $!
ao final do seucommand1
.fonte