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 eu reconheci um problema com essa abordagem se o recurso esperado não fosse disponibilizado por algum motivo: O trabalho trava permanentemente em start/pre-start
, o que é esperado, mas se eu emitir um evento stop
, o pre-start script
não é morto ou algo assim, o que eu presumi erroneamente, mas o estado do trabalho foi alterado para stop/pre-start
. O problema com isso é que o shell no qual eu emiti o evento stop
fica suspenso para sempre agora, provavelmente esperando que o pre-start script
seja concluído. Se eu usar CTRL + C que shell e emite 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 visto facilmente usando status
, que gera 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 deve parar de esperar por si mesmo.
Não consigo encontrar nenhum argumento force
ou tal para o 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.
Tags bash upstart linux bash-scripting