upstart: relatório de erro de correio no segfault

0

Eu tenho um processo gerenciado por upstart. Ele envia um relatório de erros sobre exceções internas, mas como o aplicativo não está escrito em C, ele não pode capturar um SIGSEGV e enviar um relatório de erro sobre isso. (Não que isso seja uma boa prática em C).

Eu acho que deveria ser possível começar o pontapé inicial de um script para enviar o relatório de erro, mas não consigo descobrir como fazer isso. Parece haver três abordagens possíveis:

1) um script de pós-parada. No entanto, EXIT_SIGNAL não está disponível em um script de pós-parada

2) start on stopped . Crie uma configuração de upstart separada com um script start on stopped . Isso funciona muito bem, mas apenas se eu remover respawn da configuração original. Isso não é aceitável.

3) Use técnicas de script:

script
  cmd &
  PID=$!
  wait $PID
  if [ $? = 139 ] ; then cleanup ; fi
end script

No entanto, o bloco de script upstart parece funcionar como set -e em um shell, portanto, o script é encerrado quando o cmd falha e nunca chegamos ao bloco if.

    
por Bryan Larsen 12.12.2013 / 19:51

1 resposta

1

Entendi para funcionar. O truque é semelhante ao # 3, mas use um script de shell em um arquivo em vez de inline no arquivo upstart.conf. Dessa forma, você pode pular o -e e usar o bash em vez do traço.

Se você realmente quiser evitar um script separado, ignore o comportamento -e usando || :

script
  cmd &
  PID=$!
  wait $PID || export EXIT_CODE=$?
  if [ $EXIT_CODE -eq 139 ] ; then cleanup ; fi
end script
    
por Bryan Larsen 13.12.2013 / 21:51