Estou procurando uma maneira padrão ou uma prática recomendada para manter vivo um daemon iniciado por um init.d
script 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:
Existe uma maneira de conseguir manter vivo algum processo do script de shell init.d. É uma prática padrão / melhor maneira?
É recomendável manter um processo vivo com loop infinito? Eu acho que é melhor usar algum comando como esse
respawn
para conseguir isso. Está certo?
Eu sei sobre a existência do respawn
comando. 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
, cron
e ferramentas de sistema como start-stop-daemon
. Quero dizer, apenas as ferramentas padrão)
Muito obrigado pelo seu tempo!
Respostas:
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=always
está definido na[Service]
seção do arquivo de serviço .Várias outras opções também estão disponíveis, para cenários mais complexos.
fonte
systemd
parece descartarinit.d
script e base em*.service
systemctl edit myservice
, em seguida,systemctl daemon-reload
e reiniciar myservice.Você pode adicioná-lo
/etc/inittab
comrespawn
:É um truque sujo, mas eu o usei com sucesso no passado em sistemas sysv-init mais antigos.
fonte
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.
fonte
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
fonte
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.
fonte