Maneira "adequada" de executar o shell script como um daemon
Estou escrevendo um shell script que gostaria de executar como um daemon na inicialização sem usar ferramentas externas, como daemontools ou daemonize .
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)
altera o diretório de trabalho para um que é persistente (geralmente /)
cria um ID de sessão (SID) exclusivo
A Introdução do daemonize vai além, afirmando que um daemon típico também:
desassocia-se de seu grupo de processos
alças SIGCLD
Como eu poderia fazer tudo isso em um sh, dashou bashscript 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 nohupor 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 SysVdaemons de estilo antigo e os mais systemdnovos. Como a compatibilidade com uma variedade de distribuições é importante, verifique se a resposta esclarece todas as diferenças.
— user339676
A maneira "adequada" de criar seu próprio script de shell é fazer com que ele faça seu próprio registro, forneça um método para iniciá-lo como um daemon etc. Coisas assim daemone 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"!
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.
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.
— johnramsden
Embora eu goste da abordagem systemd, o OP disse "sem ferramentas externas". Existem distribuições Linux que ainda não possuem systemd, ou permitem que você escolha entre systemd e outra coisa, por exemplo, OpenRC.
Para distribuições que usam systemd, systemdnão é mais uma "ferramenta externa" do que bash.
Provavelmente estou perdendo alguma coisa aqui; por que exatamente não nohupseria apropriado? Claro que não basta apenas , mas complementá-lo parece simples.
a saída é redirecionada adequadamente (use / dev / null, se necessário)
o script daemon.sh é reparado para init(ou systemd)
Eu estava prestes a sugerir algo muito semelhante. Eu uso nohupcom &e redirecionamento de E / S para iniciar vários Cutilitários que não são daemon, talvez com a segurança adicional de agrupar seu nohupcomando dentro de um su -c "nohup ... &" -s /bin/bash systemUserpara executar o daemon como um usuário não privilegiado.
— 111 ---
O screencomando 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 ...
— S.Haran
screennã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.