Existem duas maneiras que encontrei para resolver o problema, e nem é perfeito:
- Upstart tem a sub-rotina
kill signal
. Se você definirkill signal QUIT
e tambémkill timeout 600
, o Upstart enviaráSIGQUIT
para o processo e aguarde 600 segundos antes de enviarSIGKILL
. Se o processo terminar antes deSIGKILL
ser enviado, então estamos bem. Há problemas com essa abordagem: (a) ele enviaSIGKILL
e nãoSIGTERM
após o tempo limite que não permite que o trabalhador de resque se feche bem, mas isso não é nada demais. (b) Um problema pior que eu descobri é que o upstart envia o "kill signal" (no nosso casoSIGQUIT
) para todos os processos da sessão, o que provavelmente interferirá na operação de processos filhos do resque worker (% co_de A ação% padrão é terminar com um dump principal). - Implemente seu próprio wrapper que aprisiona qualquer sinal que seu upstart configurado envie (ou apenas assuma o padrão
SIGQUIT
) e lide com todo o desligamento normal. Nesse caso, é importante configurar o UpstartSIGTERM
para um tempo suficiente para permitir que o wrapper execute um encerramento normal e force a interrupção com o tempo esgotado (nesse caso, certifique-se de ter o tempo limite um pouco menor que o Upstart) ou apenas confie nokill timeout
do Upstart para a limpeza (o que pode ou não ser uma boa ideia dependendo dos seus requisitos). Contras: é bastante complicado fazer isso direito, e a razão pela qual o Upstart existe é que você não precisará escrever um gerenciador de processo para cada serviço.
Se você não quer ir de qualquer forma, existem outros gerenciadores de processos que podem implementar um sistema de sinal mais complexo que o Upstart, e estes geralmente são fáceis de implementar sob o Upstart para gerenciar apenas o processo que você está tendo. um problema com. Infelizmente, é difícil encontrar um que funcione corretamente em todos os casos. Por exemplo, eu tentei Bluepill , que parece ótimo no papel, mas no momento da escrita tem um bug gritante onde se você tente um regime de sinal complexo com múltiplos sinais e múltiplos timeouts, ele apenas envia todos os sinais de uma vez (não necessariamente na ordem correta) e trava o processo filho.
Se alguém tiver mais informações para adicionar, sinta-se à vontade para adicionar mais respostas e eu posso até marcá-las como "respondidas" (em vez da minha resposta), se estiver bom.