Eu tenho o seguinte pre-start script
em uma das minhas configurações do Upstart:
pre-start script
cd "$(dirname "$(dirname "$(readlink "/etc/init/${UPSTART_JOB}.conf")")")"
. "lib/upstart/waitFor[...].sh"
end script
A função chamada é essencialmente apenas um loop sem fim esperando que algum recurso fique disponível para o qual nenhuma configuração Upstart existe atualmente:
function waitFor[...]()
{
while [ true ]
do
if [...] > /dev/null
then
break
fi
sleep 10s
done
}
waitFor[...]
Ontem reconheci um problema com essa abordagem se o recurso esperado não fica disponível por algum motivo: o trabalho fica pendurado para sempre em start/pre-start
, o que é esperado, mas se eu emitir um stop
evento, o pre-start script
não é morto ou tal, o que eu erradamente assumido, mas em vez disso o estado do trabalho é alterado para stop/pre-start
. O problema com isso é que o shell em que eu emiti o stop
evento paira para sempre agora, provavelmente esperando o pre-start script
terminar. Se eu CTRL + C que shell e problema stop
novamente, Upstart me diz que o trabalho já está parado e retorna rápido, mas o pre-start script
ainda está em execução, o que pode ser facilmente visto usando status
, que produz stop/pre-start
novamente.
Então, eu preciso de alguma forma para forçar o Upstart a matar o script em si ou de alguma forma no script para reconhecer que ele deveria parar de esperar por si mesmo.
Eu não encontrei nenhum force
argumento ou tal para Upstart, apenas --no-wait
. Mas isso não para o script de espera, apenas não bloqueia mais a shell de parada. Então, há alguma mudança de estado em que o script possa se reconhecer facilmente? A única coisa que posso pensar atualmente é consultar o status do trabalho em si.
Mais alguma ideia? Eu acho que eu preferiria algum argumento de linha de comando para parar que eu poderia ter perdido.
fonte