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.

Thorsten Schöning
fonte