Como executar um programa C como daemon?

Como executar um programa C como daemon?

Eu tenho um programa C que desejo executar como um daemon. Estou trabalhando no Ubuntu 14.04LTS. Qual é a maneira certa de fazer isso? Alguém pode ajudar?

Responder1

E agora, a resposta do Ubuntu.

A maneira certa de fazer isso é no gerenciador de daemon que vem com o Ubuntu 14. O que outros disseram aqui sobre projetar um programa explicitamente para ser um daemon e chamar uma daemon()função de biblioteca é totalmente equivocado. Ironicamente, o Ubuntu teve início em três versões LTSanteriorpara a versão 14 LTS – desde o Ubuntu 6.10 em 2006, na verdade. Desde então, ele teve um gerente daemon, de um tipo ou de outro.

A resposta certa para pessoas com gerenciamento de serviços adequado é que vocênãoligue daemon()e vocênãotome medidas especiais para "ser um daemon". E para algumas pessoas esta tem sido a resposta certa desde o início da década de 1990. Mesmo 2006 chegou um pouco atrasado para a festa. ☺ Mesmo assim, tem sido definitivamente a resposta certa nos últimos dez anos quando se trata de Ubuntu.

O que você faz é simples. Você configura um arquivo de "trabalho" inicial que informa ao iniciante quando e como invocar seu programa. arrivista invoca issojá demonizado, sem terminal de controle e com estado de processo inicial previsível e invariável. Seu programanão faz nada de especiale 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á gravado no erro padrão.

Olivro de receitas iniciantedescreve tudo isso em detalhes, incluindo as diversas sub-rotinas que controlam eventos de inicialização e manipulação de logs. E há muito sobre o assunto aqui e no AskUbuntu.

Esteja preparado para o fato de que o mundo mudará significativamente para você se você atualizar posteriormente para o Ubuntu 16 LTS. Mas mesmo assimnão faça nada de especial no código e simplesmente execute sob um gerenciador de daemoncontinuará sendo a resposta certa.

Leitura adicional

Responder2

Se o seu objetivo é executar o programa a partir de um terminal, aqui estão algumas maneiras (seu programa não deve solicitar nenhuma entrada do usuário):

  • Usando nohup: nohup program > program.log 2>program.err &. Então você pode sair do terminal.

  • Usando atdo serviço: echo "program > program.log 2>program.err" | at now
    ou echo "program > program.log 2>program.err" | batch.

  • como um serviço por um script de inicialização.

Se o seu programa estiver solicitando a entrada do usuário, não será possível executá-lo fora de um terminal. O melhor é usar uma sessão screenou tuxe depois desanexá-lo do terminal.

informação relacionada