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.
fonte
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"!Respostas:
Usando systemd, você poderá executar um script como um daemon criando uma unidade simples. Você pode adicionar muitas opções diferentes , mas isso é o mais simples possível.
Digamos que você tenha um script
/usr/bin/mydaemon
.Você cria uma unidade
/etc/systemd/system/mydaemon.service
.Para iniciar o demônio você corre
Para iniciar na inicialização, habilite-o
Se em um sistema baseado em systemd, que hoje é a maioria das distribuições Linux, essa não é realmente uma ferramenta externa. O negativo seria que, embora não funcione em todos os lugares.
fonte
systemd
não é mais uma "ferramenta externa" do quebash
.Provavelmente estou perdendo alguma coisa aqui; por que exatamente não
nohup
seria apropriado? Claro que não basta apenas , mas complementá-lo parece simples.Tanto quanto eu posso ver:
stdin
morre no final do script pai, no entantoinit
(ousystemd
)Tenho uma forte sensação de que estou perdendo o óbvio. Voto a favor, mas por favor me diga o que é :-)
fonte
nohup
com&
e redirecionamento de E / S para iniciar váriosC
utilitários que não são daemon, talvez com a segurança adicional de agrupar seunohup
comando dentro de umsu -c "nohup ... &" -s /bin/bash systemUser
para executar o daemon como um usuário não privilegiado.O
screen
comando Linux contido na maioria das distros pode daemonizar um script de shell. Eu o uso frequentemente. Aqui está um exemplo rápido para iniciar, listar e sair de uma sessão de tela desanexada ...fonte
screen
não desonra o script de shell. Basta executá-los em um terminal distinto e pode se desconectar desse terminal (como desconectar o teclado do PC) sem fechar a sessão. Portanto, o programa em execução no terminal desanexado está sendo executado em segundo plano. Portanto - desanexe o programa de aprovação em segundo plano.