Estou tentando escrever um script bash robusto e nele crio um processo em segundo plano. No final do script, eu quero matá-lo. Eu tenho o PID.
Eu estava pensando em algo assim
while [[ ps ef $PID ]] ; do
kill $PID
sleep 0.5
done
Alguma sugestão para algo melhor? Algum problema possível com essa abordagem?
ps -ef
?while [[ ps ef $PID ]]
é um erro de sintaxe. Eu suponho que você quis dizerwhile ps ef $PID
.Respostas:
O problema de 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ê dorme.
Por que você está tendo que matar repetidamente o processo? Se é porque o processo será encerrado, mas pode demorar algum tempo para sair depois de receber o sinal, você pode usar
wait
:Em um sistema ideal, você nunca precisaria repetir um
kill
ou problemakill -9 $PID
. Se você precisar, considere consertar o que quer que esteja executando para não precisar. Enquanto isso, você provavelmente não atingirá a condição de corrida e poderá se proteger contra (digamos) verificando o carimbo de data / hora de / proc / $ PID / antes de interromper o processo. Isso é mau truque, no entanto.fonte
bash: wait: pid 32137 is not a child of this shell
quando tento. :(Para todos recomendando o passo a partir
kill $PID
dekill -9 $PID
, eu teria que lembrá-lo de uso inútil de kill -9 .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
.Também concordo com o cuidado com as condições de corrida na criação de novos processos com o mesmo IDP mencionado aqui .
fonte
Primeiro, faça sua matança normal, durma x número de segundos e, em seguida, mate -9 se ainda estiver por perto. Além disso, isso parece uma situação estranha em que você entrou, talvez queira nos explicar o problema maior.
fonte
Normalmente você quer tentar
kill $PID
primeiro,então deixe-o dormir um pouco para ver se ele sairá normalmente.
Caso contrário, execute
kill -9 $PID
para se livrar dele com força.fonte
porque não apenas
kill -9 $PID
fonte