Isso é o que geralmente acontece com programas daemon:
- Upstart executa o executável no primeiro plano
- O programa carrega o arquivo de configuração, verifica, executa várias operações de configuração (como abrir uma porta de escuta).
- Se a etapa anterior falhar, o programa sai e o upstart obtém um código de saída diferente de zero, portanto, sabendo que ele falhou
- Se a etapa 2 não falhar, o programa agora se bifurca, criando essencialmente duas cópias dela
- O processo que o Upstart executou agora sai com um código de saída zero, indicando que foi bem-sucedido
- O processo bifurcado continua em execução e faz o trabalho real do aplicativo
O problema é que o Java não fornece um mecanismo para bifurcar e, portanto, esse padrão experimentado e testado não pode ser implementado corretamente. Ao executar daemons Java, você é forçado a colocar em segundo plano o processo imediatamente (ou seja, o símbolo &
no script). Inicialmente, o Startstart inicia o processo e imediatamente se esquece disso - o processo não tem como indicar ao Upstart se ele foi inicializado com sucesso ou não.
A única maneira de contornar isso é iniciar o processo, contextualizá-lo e, em seguida, verificar se ele ainda está sendo executado para determinar se foi bem-sucedido ou não. A pegada, claro, é determinar quando para verificar se ainda está em execução. A solução simples é algo assim:
#!/bin/sh
java MyClass >/dev/null 2>&1 &
PID=$!
sleep 3
if kill -0 $PID; then
exit 0
else
exit 1
fi
Existem mais esquemas elaborados para determinar quando verificar o processo, como fechar o programa stdout e stderr ou crie seu arquivo PID quando terminar sua rotina de inicialização e aguarde esses eventos no script de inicialização.
A solução mais simples para você é modificar seu script Upstart para algo assim:
script
cd /usr/lib/app-dir
nohup ./appStartScript.sh &> /dev/null &
PID=$!
sleep 3
if kill -0 $PID; then
emit app_running
exit 0
else
exit 1
fi
end script