Snippet de bash para matar um processo até que esteja morto?

8

Estou tentando escrever um script robusto e nele eu crio um processo em segundo plano. No final do script, quero matá-lo. Eu tenho o PID.

Eu estava pensando em algo parecido com isso

while [[ ps ef $PID ]] ; do
  kill $PID
  sleep 0.5
done

Algum sugere algo melhor? Quaisquer possíveis problemas com esta abordagem?

    
por Rory 23.07.2009 / 17:39

5 respostas

10

O problema em matar repetidamente um processo é que você tem uma condição de corrida com a criação do novo processo. Não é particularmente provável, mas é possível que o processo seja encerrado e um novo processo seja iniciado com o mesmo PID enquanto você estiver dormindo.

Por que você está tendo que matar repetidamente o processo? Se é porque o processo irá sair, mas pode levar algum tempo para sair depois de receber o sinal, você pode usar wait :

 kill $PID
 wait $PID

Em um sistema ideal, você nunca precisará repetir um kill ou um problema kill -9 $PID . Se você precisar, considere corrigir o que está sendo executado para não precisar fazer isso. Enquanto isso, você provavelmente não atingirá a condição de corrida, e você pode se proteger contra isso (por exemplo) verificando o timestamp de / proc / $ PID / antes de matar o processo. Isso é mau hackiness, embora.

    
por 23.07.2009 / 18:18
9

Para todos que recomendam a etapa de kill $PID a kill -9 $PID , tenho de lembrá-lo de Inútil uso de matar -9 .

No no no. Don't use kill -9.

It doesn't give the process a chance to cleanly:

  1. shut down socket connections

  2. clean up temp files

  3. inform its children that it is going away

  4. reset its terminal characteristics

and so on and so on and so on.

Generally, send 15, and wait a second or two, and if that doesn't work, send 2, and if that doesn't work, send 1. If that doesn't, REMOVE THE BINARY because the program is badly behaved!

Don't use kill -9. Don't bring out the combine harvester just to tidy up the flower pot.

Agora, eu não concordo com o "remover a parte binária", mas a progressão parece menos prejudicial do que apenas um kill -9 .

Eu também concordo com o cuidado com as condições de corrida na criação de novos processos com o mesmo PID mencionado aqui .

    
por 23.07.2009 / 19:16
0

Primeiro, faça a sua matança normal, durma x número de segundos e depois mate -9 se ainda estiver por perto. Além disso, isso parece uma situação estranha em que você chegou, talvez queira nos explicar o problema maior.

    
por 23.07.2009 / 17:49
0

Normalmente, você quer experimentar kill $PID primeiro,

deixe-o dormir um pouco para ver se ele sairá normalmente.

Se não, então execute kill -9 $PID para se livrar dele.

    
por 23.07.2009 / 17:50
-1

porque não apenas

kill -9 $PID

    
por 23.07.2009 / 17:47