Maneira padrão ou melhor de manter vivo o processo iniciado por init.d

13

Estou procurando uma maneira padrão ou uma prática recomendada para manter vivo um daemon iniciado por um init.dscript de shell.

Ou melhor ainda, existe uma maneira de mantê-lo vivo diretamente /etc/init.d?

Especificamente, eu tenho um daemon chamado dtnd with e loop infinito que procura por um processo final inesperado, se houver algum, o daemon os ativa novamente. Além disso, eu uso a ferramenta start-stop-daemon para permitir que o precess seja executado a partir de um determinado usuário do sistema.

Eu quero executar este daemon dtnd na inicialização. Para atingir esse comportamento, criei um script init.d que "agrupa" o arquivo dtnd usando os comandos start, stop e status.

Tenho 2 perguntas que gostaria de resolver:

  1. Existe uma maneira de conseguir manter vivo algum processo do script de shell init.d. É uma prática padrão / melhor maneira?

  2. É recomendável manter um processo vivo com loop infinito? Eu acho que é melhor usar algum comando como esse respawnpara conseguir isso. Está certo?

Eu sei sobre a existência do respawncomando. Acho que é disso que preciso, mas não entendo o fluxo de trabalho entre /etc/init.d/e /etc/init. Alguém pode me ajudar?

Note que eu não tenho inittab nem arrivista (eu só estou autorizado a utilização /etc/init, /etc/init.d, crone ferramentas de sistema como start-stop-daemon. Quero dizer, apenas as ferramentas padrão)

Muito obrigado pelo seu tempo!

Adrian Antunez
fonte
possível duplicata do script
ewwhite

Respostas:

13

O Debian eventualmente terá o systemd, então esta é a maneira de fazê-lo em um sistema Linux que usa o systemd (e muitos já o fazem; você pode considerar trocar de distribuição).

O Systemd pode cuidar de manter o serviço ativo automaticamente para você; nenhuma outra ferramenta é necessária. Simplesmente verifique se Restart=alwaysestá definido na [Service]seção do arquivo de serviço .

# vi /etc/systemd/system/dtnd.service

[Service]
Restart=always
#...everything else...

Várias outras opções também estão disponíveis, para cenários mais complexos.

Michael Hampton
fonte
2
Embora o futuro mostre opções mais flexíveis, isso cuida do ambiente / condições atuais? A instalação de uma ferramenta parece ser o caminho de menor resistência em comparação com uma alteração / atualização da distribuição de empilhadeiras.
ewwhite
@whwhite Depende. O Debian tem systemd desde o wheezy, mas não era o init padrão. Deve ser o padrão de jessie. E como nosso usuário aceitou a resposta, presumo que ele já esteja usando o systemd por outro motivo (ou tenha permissão para instalá-lo).
Michael Hampton
systemdparece descartar init.dscript e base em*.service
yurenchen 28/02
2
Em vez de editar diretamente o uso mais seguro systemctl edit myservice, em seguida, systemctl daemon-reloade reiniciar myservice.
Pablo A
@PabloBianchi Criar uma substituição é bom se você estiver substituindo uma unidade de serviço existente. Se você está criando uma unidade a partir do zero, como o OP fez, então não faz sentido.
Michael Hampton
3

Você pode adicioná-lo /etc/inittabcom respawn:

d1:2345:respawn:/path/to/your/first_daemon arg1 arg2
d2:2345:respawn:/path/to/your/second_daemon arg1 arg2

É um truque sujo, mas eu o usei com sucesso no passado em sistemas sysv-init mais antigos.

Dennis Kaarsemaker
fonte
Mas os daemons normalmente não calam setsid () e fork () para rodar em segundo plano?
symcbean
Obrigado! Como você diz, é um truque sujo, mas funciona. Enfim, eu prefiro o uso do systemd. Agora eu sei sobre a existência.
Adrian Antunez
Isso não funciona no RHEL6. O utilitário de reaparecimento não parece estar disponível.
Djidiouf 26/09/16
2

Bem, essa é uma das principais razões pelas quais o debian está migrando para o systemd.

O sysvinit (/etc/init.d) não pode detectar se um serviço está inativo / não está respondendo. Isso significa que você precisa monitorar esses serviços e escalar se um serviço não fizer mais o trabalho dele.

provavelmente a coisa mais fácil a fazer seria migrar para outro manipulador de daemon como systemd (padrão no RHEL7, será padrão no próximo debian e ubuntu lts), upstart (padrão no RHEL6, Ubuntu 12.04 e 14.04), daemontools (como mencionado, desenvolvido por djb) ou qualquer outra coisa.

fazer o trabalho de manter um serviço ativo será PITA em sysvinit.

janaurka
fonte
1

A melhor prática é garantir que seus daemons NÃO PAREM em primeiro lugar.

Se você não quiser dar uma olhada nos daemontools da DJB

symcbean
fonte
3
Obviamente, a melhor prática é garantir que meus daemons não parem. Mas existem muitas aplicações que seguem a abordagem se-eu-parar-acordar-me como apache2, mysql, samba, pulseaudio ... Eu estive procurando por daemontools e parece uma boa abordagem. Infelizmente, não tenho permissão para instalar ferramentas externas. Eu preciso fazer isso usando scripts bash ou start-stop-daemon e init.d configs.
Adrian Antunez
1

A abordagem padrão para mim é usar o utilitário Monit para isso.

Na sua descrição, não sei bem se você escreveu algo como Monit e está tentando garantir que esteja funcionando, ou se precisa de algo para assistir ao daemon que você criou.

ewwhite
fonte
1
Oi ewwhite, eu tenho que garantir que meu aplicativo está sendo executado. Infelizmente, não tenho permissão para instalar ferramentas externas. Eu preciso fazer isso usando scripts bash ou start-stop-daemon e init.d configs.
Adrian Antunez
2
@ AdriánAntúnez Se você não tem permissão para instalar as ferramentas necessárias para fazer seu trabalho, conserte o problema o mais rápido possível.
Michael Hampton
@ AdriánAntúnez Você pediu "padrão". Monit é bem conhecido / bem considerado. Você pediu o "melhor" ... Sua restrição é mais política. Por que você não teria permissão para instalar o software?
ewwhite
1
Não é uma ferramenta ou dependência desnecessária se ela faz o que você quer que faça .
ewwhite
1
Desculpe, eu quis dizer evitar dependências de ferramentas externas.
Adrian Antunez