Padrão ou melhor maneira de manter o processo ativo iniciado pelo init.d

11

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

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

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

Eu quero rodar este daemon dtnd da inicialização. Para conseguir esse comportamento, criei um script init.d que "encapsula" o arquivo dtnd usando os comandos start, stop e status.

Eu tenho 2 perguntas que gostaria de resolver:

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

  2. É recomendado manter um processo ativo com loop infinito? Eu acho que é melhor usar algum comando como respawn para conseguir isso. Está correto?

Eu sei da existência do comando respawn . 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 não tenho inittab nem upstart (só posso usar /etc/init , /etc/init.d , cron e ferramentas do sistema como start-stop-daemon . Quero dizer, apenas as ferramentas padrão)

Muito obrigado pelo seu tempo!

    
por Adrian Antunez 10.07.2014 / 12:15

5 respostas

10

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 a mudança de distribuições).

O Systemd pode manipular automaticamente o serviço para você; nenhuma outra ferramenta é necessária. Simplesmente certifique-se de que Restart=always esteja definido na seção [Service] 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 .

    
por 10.07.2014 / 14:27
3

Você pode adicioná-lo a /etc/inittab com respawn :

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

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

    
por 10.07.2014 / 14:47
2

Bem, essa é uma das principais razões, por que o debian está mudando para o systemd.

sysvinit (/etc/init.d) não é capaz de detectar, se um serviço está inoperante / não está respondendo. Isso significa que você precisa monitorar esses serviços e escalar se um serviço não fizer mais seu trabalho.

provavelmente a coisa mais fácil de fazer seria migrar para outro daemonhandler 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á o PITA no sysvinit.

    
por 10.07.2014 / 15:05
1

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

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

    
por 10.07.2014 / 13:45
1

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

Eu não sei dizer da sua descrição se você escreveu algo como o Monit e está tentando se certificar de que está sendo executado, ou se você precisa de algo para assistir ao daemon que você criou.

    
por 10.07.2014 / 13:49