Como faço para evitar condições de corrida nos scripts do Upstart 'starting on'?

2

Estou trabalhando em um pacote que precisa de duas tarefas do Upstart: uma que inicia um daemon e outra que inicia um daemon de suporte se o arquivo de configuração exigir. A lógica para determinar se o daemon de suporte deve ser lançado envolve o processamento do arquivo de configuração com sed e amigos, o que causa problemas com a detecção de daemonização do Upstart (Upstart não tem como distinguir PIDs), portanto expect fork e expect daemon aren ' t útil. Infelizmente, isso significa que o Upstart detecta a primeira chamada de sed como o primeiro PID e inicia imediatamente o trabalho principal, antes que o daemon de suporte seja totalmente inicializado. Isso freqüentemente leva ao término prematuro do trabalho principal, devido a um ambiente configurado incorretamente.

Existe alguma maneira de impedir que o Upstart inicie o trabalho principal muito cedo neste cenário?

expect stop parece estar perto do que eu preciso, mas eu não vejo uma maneira de aumentar o sinal sem terminar um dos daemons, nenhum dos quais gera o sinal SIGSTOP por conta própria.

    
por cqcallaw 12.07.2012 / 17:30

2 respostas

1

A solução para isso acabou na documentação do Upstart :

  

Crie uma seção de pós-inicialização que realize alguma verificação e retorne somente quando o serviço estiver "pronto".

    
por cqcallaw 19.07.2012 / 04:05
1

Simples - use a sub-rotina pre-start para executar toda a verificação sed . Se o pre-start determinar que o daemon de suporte não deve ser iniciado, basta chamar stop (o que força o Upstart a não continuar a iniciar o trabalho). Há um exemplo disso no Cookbook Upstart aqui:

link

Observe que o Upstart executa somente rastreamento de PID para as estrofes exec e script (em outras palavras, a parte "principal" do trabalho) - PIDs para pre-start , post-stop et al não são rastreados. Veja o link

    
por jamesodhunt 17.07.2012 / 09:36