wait não espera

4

Se eu tiver um arquivo chamado myprogram contendo

sleep 200
date

Execute isso em segundo plano:

$ sh myprogram &

Eu quero saber quando myprogram foi concluído usando o comando wait

$ cat >notify
wait PID
echo "Program completed"
$ sh notify &

PID é o ID do processo dado pelo terceiro comando, meu problema é que a mensagem "programa concluído" impresso no terminal imediatamente após o último comando, por que esperar não espera? , eu estou usando o Ubuntu 11.10

    
por Hesham Abouelsoaod 16.08.2012 / 17:45

2 respostas

6

A relação pai-filho é arruinada por todos os '&' envolvido.

A chamada do sistema wait(2) , na qual o wait incorporado é aparentemente baseado, só funcionará para um PID filho direto do processo que chama wait(2) .

Quando você invoca sh myprogram & , você executa sh como filho do shell interativo.

Quando você invoca sh notify & , esse sh é filho do shell interativo.

Portanto, o segundo sh não tem nenhum relacionamento pai direto com o primeiro sh e wait não funcionará.

Isso nem funcionará se você invocar sh myprogram &; sh notify; , porque o comando wait é invocado por um filho do shell interativo.

O que funciona para mim é: sh myprogram &; wait O comando wait faz com que o shell interativo (pai do sh chamado explicitamente) permaneça até que sh seja encerrado.

    
por 16.08.2012 / 18:01
0

Neste exemplo específico, é melhor executar apenas wait no shell principal, como mostra a resposta de Bruce, mas se você tivesse alguma situação alternativa em que não pudesse fazer isso - por exemplo, se precisar executar myprogram como um processo em primeiro plano, ou se é um daemon sem um terminal de controle - você pode usar um programa que eu escrevi chamado pwait que aguardará a conclusão de um processo arbitrário. Para usá-lo neste exemplo, depois de executar

$ sh myprogram

você obteria o ID do processo de myprogram de alguma forma e, em seguida, em notify , em vez de wait que você usaria

pwait PID

Minha versão de pwait é apenas para Linux, por enquanto. Se você está executando o FreeBSD, eles têm sua própria implementação , que parece estar disponível como padrão utilidade. Você também pode classificá-lo usando ps para verificar repetidamente se o comando foi concluído, como em este script de shell (embora não informa o código de saída do comando, caso seja relevante).

    
por 21.10.2015 / 11:08