E agora, a resposta do Ubuntu.
O jeito certo de fazer isso é sob o gerenciador do daemon que vem com o Ubuntu 14. O que outros disseram aqui sobre projetar um programa explicitamente para ser um daemon, e chamar uma função de biblioteca daemon()
, é totalmente equivocado. Ironicamente, o Ubuntu teve inicio para três versões LTS anteriores para a versão 14 LTS - desde o Ubuntu 6.10 em 2006. Tem um gerente de daemon, de um tipo ou outro, desde então.
A resposta certa para pessoas com gerenciamento de serviço adequado é que você não chama daemon()
e você não toma medidas especiais para "ser um daemon". E para algumas pessoas esta tem sido a resposta certa desde o início dos anos 90. Mesmo 2006 foi um pouco tarde para a festa. ☺ Mesmo assim, definitivamente tem sido a resposta certa nos últimos dez anos quando se trata do Ubuntu.
O que você faz é simples. Você configura um arquivo "job" inicial que informa ao upstart quando e como invocar seu programa. O upstart invoca isso já desmonhecido , sem um terminal de controle e com um estado de processo inicial previsível e invariável. Seu programa não faz nada de especial e simplesmente executa, gravando logs e mensagens de erro no erro padrão da maneira normal. Você organiza no arquivo de trabalho como o upstart lida com o que está escrito no erro padrão.
O Cookbook upstart descreve tudo isso em detalhes, incluindo as várias sub-rotinas que controlam eventos de inicialização e tratamento de log. E há muito sobre o assunto aqui e no AskUbuntu.
Esteja preparado para o fato de que o mundo vai mudar em você de forma bastante significativa se você atualizar posteriormente para o Ubuntu 16 LTS. Mas, mesmo assim, não fazer nada especial no código e simplesmente rodar sob um gerenciador de daemon continuará a ser a resposta certa.