Script de shell para executar algo quando um daemon morre?

3

Eu só tive que construir duas instâncias do daemon em execução em portas diferentes. Vamos dizer que ambos servem missões críticas para algumas aplicações.

Como posso executar alguma tarefa automática (por exemplo, script de shell) para verificar os dois daemons quando um deles não é veiculado?

Que tipo de script que sempre pode verificar a vida do daemon e talvez possa executar alguns outros trabalhos se um dos daemons parasse acidentalmente?

    
por racbear 31.05.2009 / 16:57

7 respostas

7

monit é ótimo neste caso - ele é executado em localhost, portanto, você não precisa de uma conexão de rede para reiniciar seu daemon (no caso de falha, ou o daemon é responsável pela rede). Ele também ocupa pouco espaço no sistema, e você pode usá-lo para monitorar seus outros daemons / espaço em disco / etc. também.

Crie um script start / stop (parecido com aqueles em /etc/init.d/ e crie links simbólicos para ele em runlevels que seu sistema usa para operação normal, assegurando que seu daemon inicie na reinicialização e pare no shutdown apropriadamente. não tem pidfile, crie um usando o script start-stop-daemon .

Depois disso, instale monit e crie a configuração para seu daemon, algo assim:

check process daemond with pidfile /var/run/daemond.pid
    start program "/etc/init.d/daemond start"
    stop program "/etc/init.d/daemond stop"
    if failed port 1234 type TCP for 5 times within 10 cycles then restart
    if 3 restarts within 5 cycles then alert

Esta configuração irá garantir que, se o daemon parar de responder na porta tcp 1234, ou irá parar de ser executado, ele será reiniciado usando o script init. monit também enviará um alerta por e-mail ou fará outras ações, dependendo de como você o configurar. Basta verificar monit(1) manpage.

    
por 31.05.2009 / 17:27
0

Meu conselho seria usar sua (espero) infra-estrutura de monitoramento existente.

Eu uso o Nagios e eu questiono minhas máquinas Linux com o SNMP. O MIB do Linux me permite recuperar os nomes de todos os processos em execução, juntamente com o PID e os argumentos. Eu uso isso para monitorar vários daemons (como o crond) que não abrem portas.

    
por 31.05.2009 / 17:04
0

Depende muito no daemon.

Se o daemon tiver uma API e você puder se comunicar através de um soquete TCP / IP ou de um soquete UNIX, você poderá fazer isso.

Se ele escutar em uma porta TCP / IP, por exemplo, você pode escrever um script que se conecte a ele, esperar uma determinada resposta - e também quanto tempo leva para obter essa resposta - você pode alimentar isso para monitorar ferramentas como como nagios, munin, ou outro - qualquer script que você terminar escrevendo para realizar uma única verificação, você poderá integrar facilmente no plugin nagios, por exemplo - que é provavelmente o que você quer fazer - depois de ter escrito seu script de verificação.

Se você não fornecer nada útil, não ouvir em uma porta, tudo que você pode fazer é verificar a árvore de processos usando lsof, netstat ou algo assim, e apenas certifique-se de que ela existe, mas você não pode realmente faça um exame de saúde.

Você precisará ser mais específico antes que alguém aqui possa lhe oferecer algo útil.

Dê uma olhada no PID do daemon em execução e, em seguida, procure em /proc/<PID>/fd para obter uma visualização de quais pipes / sockets / files o daemon está interagindo - isso pode ajudá-lo a começar.

    
por 31.05.2009 / 17:03
0

Bem, eu tenho um cheque favorito para algo quando ele é incrivelmente simples. Basta ligar com:

/ caminho / para / daemon || mail [email protected] "/ path / to / daemon morreu; do X" ou:

enquanto [[-z ""]]; do / caminho / para / daemon || mail [email protected] "/ caminho / para / daemon morreu; reiniciando"; feito

Ou algo parecido. Se o daemon sair, se houver algum problema, isso lhe dará um monitoramento muito fácil e confiável.

    
por 31.05.2009 / 17:28
0

Talvez você possa tentar iniciar as tarefas usando o daemon de inicialização (supondo que esse seja o Unix, que outras respostas parecem ter feito). Confira a página de manual do inittab, que deve explicar em detalhes como fazê-lo. Você pode organizar o processo para iniciar no momento da inicialização ou em um (a) nível (s) de execução específico (s).

Se você usar a opção respawn, seu processo será reiniciado automaticamente se falhar - ou seja, o daemon de inicialização é um monitor de processo integrado, assim como o iniciador de processo. No entanto, o daemon de inicialização também possui alguma "inteligência" de tal forma que se o daemon for reiniciado com muita freqüência em um período de tempo muito curto, o init irá parar de tentar reiniciá-lo por alguns minutos. Isso torna mais difícil para um processo invasor consumir acidentalmente toda a CPU na máquina, por exemplo.

O init normalmente será configurado para registrar entradas em / var / log em algum lugar, assim você pode logar gratuitamente.

    
por 31.05.2009 / 19:27
0

Não sei por que ninguém listou a solução óbvia e simples:

#!/bin/bash
ps ax | grep "[p]rogie" >/dev/null 2>&1
if [ $? != 0 ] ; then
    # do something
fi
    
por 31.05.2009 / 23:03
0

Eu recomendaria monit ou deus para este tipo de tarefa, através de uma ferramenta de monitoramento de rede como nagios ou um script personalizado como um dos outros cartazes recomenda.

Outro pôster incluiu um trecho de configuração para o Monit; Deus é semelhante em conceito, mas escrito em rubi. Essas duas ferramentas são escritas para lidar com esse tipo de situação e fornecem muito mais flexibilidade do que um script personalizado faria (e se o processo existir, mas não responder? E se o seu grep corresponder a um processo diferente que você não previu? ?) e fornecer suporte de limiarização e histerese "fora da caixa".

Eu poderia usar o Nagios como um caminho de alerta e notificação separado, mas eu não o usaria como a única maneira de monitorar e reiniciar o processo, pela mesma razão que eu não usaria scripts manuscritos - ele não usa fornecer flexibilidade suficiente para a maioria das situações de monitoramento, e enquanto você pode acionar eventos (como reiniciar um serviço), ele não tem a flexibilidade de ferramentas como o monit do.

    
por 31.05.2009 / 23:46