Estou escrevendo um shell script que gostaria de executar como um daemon na inicialização sem usar ferramentas externas, como daemontools ou daemonize .
HOWTO de gravação de daemon do Linux
De acordo com o HOWTO de Daemon de Gravação do Linux , um daemon adequado possui as seguintes características:
- garfos do processo pai
- fecha todos os descritores de arquivo (ou seja,
stdin
,stdout
,stderr
) - abre logs para gravação (se configurado)
- altera o diretório de trabalho para um que é persistente (geralmente
/
) - redefine a máscara do modo de arquivo (umask)
- cria um ID de sessão (SID) exclusivo
daemonize Introdução
A Introdução do daemonize vai além, afirmando que um daemon típico também:
- desassocia-se do seu terminal de controle (se houver) e ignora todos os sinais do terminal
- desassocia-se de seu grupo de processos
- alças
SIGCLD
Como eu poderia fazer tudo isso em um sh
, dash
ou bash
script com apenas ferramentas comuns do Linux?
O script deve ser capaz de executar o maior número possível de distribuições sem software adicional, embora o Debian seja nosso foco principal.
NOTA: Sei que há muitas respostas na rede StackExchange que recomendam o uso de nohup
or setsid
, mas nenhum desses métodos atende a todos os requisitos acima.
EDIT: A página de manual do daemon (7) também fornece algumas dicas, embora pareça haver algumas diferenças entre os SysV
daemons de estilo antigo e os mais systemd
novos. Como a compatibilidade com uma variedade de distribuições é importante, verifique se a resposta esclarece todas as diferenças.
daemon
e outras coisas são para executar scripts shell arbitrários sem nenhuma provisão para execução como um daemon. Como você é o autor, totalmente no controle de como esse script é escrito, faça com que ele possa ser iniciado apenas a partir de um arquivo systemd unitfile ou rc.d. Você se especificar "adequada"!