
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
- James Hunt e Clint Byrum (2014). "Console". Livro de receitas para iniciantes.
- https://unix.stackexchange.com/a/200281/5132
- iniciarPáginas de manual do Ubuntu 14.04. Canônico.
- Jonathan de Boyne Pollard (2001). Erros a evitar ao projetar programas daemon Unix. Respostas dadas com frequência.
- https://superuser.com/a/723333/38062
- https://askubuntu.com/a/613814/43344
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
atd
o serviço:echo "program > program.log 2>program.err" | at now
ouecho "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 screen
ou tux
e depois desanexá-lo do terminal.