linux + cria um processo simples de watch dog em shell script

2

Eu preciso criar o processo watch dog (será executado na versão 5.x do linux) que olham o tempo todo no arquivo /etc/cluster.cf

E se o processo corresponder à string: machineA_is_active no arquivo cluster.cf

Então este processo irá executar outro script

A minha pergunta é - como executar este processo de forma a que o processo funcione sempre que o Linux estiver em funcionamento -

e caso este processo esteja em baixo, é necessário iniciar novamente este processo

Então, por favor, qual é a estrutura básica para este cenário?

(Eu ficarei feliz se obtiver um exemplo real)

    
por Eytan 19.01.2012 / 21:26

4 respostas

2

Eu não recomendaria tentar manter um processo em execução o tempo todo para fazer isso. Existem métodos mais simples. Sua máquina deve ter cron executando, que é um agendador de tarefas periódicas. Você pode programar um processo para ser executado periodicamente, com a frequência de uma vez por minuto, para verificar o conteúdo do arquivo e fazer o que precisa ser feito. Você pode adicionar algo assim ao crontab:

* * * * * /path/to/yourscript

veja man 1 crontab e man 5 crontab e man 8 cron para mais informações sobre o cron.

Melhor ainda é usar o incron, que permite que você especifique um processo para ser executado sempre que este arquivo for alterado. Se você tiver o incron instalado, você adicionaria algo assim ao incrontab:

/etc/cluster.cf IN_MODIFY /path/to/your/script

Dizendo que a qualquer momento /etc/cluster.cf é modificado, execute seu script. veja man 5 incrontab e man 1 incrontab

    
por 19.01.2012 / 22:02
1

Supondo que você esteja usando uma distribuição SysV, crie um script de inicialização e coloque-o em /etc/init.d.

Olhe para qualquer um dos scripts que já estão lá para exemplos de como formatar este script. Considere os que usam a função daemon. Você usaria chkconfig para permitir que o script fosse executado na inicialização. Este script de inicialização deve gravar seu PID em um arquivo de bloqueio. Você precisará de um segundo 'processo auxiliar' para verificar o PID do primeiro lendo o arquivo de bloqueio e determinando se ele está ou não em execução. Inclua lógica para destruir o bloqueio e reiniciar o primeiro processo, se ele não encontrar um PID em execução.

    
por 19.01.2012 / 21:51
0

Há uma coisa cujo único trabalho é (re) iniciar outras coisas, seu nome é init e é configurado através de inittab . Para fazer algo realmente imortal, adicione-o ao inittab com a opção respawn .

Um script verificador simples (um candidato para inittab ) pode ser assim:

while :
do
     grep -q machineA_is_active /etc/cluster.cf && activation_script
     # here one needs to ensure the above wan't fire again
     # - say, by carelessly wiping off /etc/cluster.cf
     # or carefully editing out the triggering record
     sleep $delay
done
    
por 19.01.2012 / 23:07
0

uma solução muito simples (não a mais elegante) para um watchdog é criar uma tarefa cron que execute um serviço que verifique o status de outro serviço.

sudo crontab -e

em seguida, coloque esta linha no final do seu arquivo crontab (atenção que vai rodar todos os dias até que você altere o crontab novamente)

* * * * * /usr/sbin/sample_service

depois CTRL-X, Y, ENTER e reinicie sua máquina.

este é um exemplo de tal serviço:

    #!/bin/bash
    #
    # watchdog
    #
    # Run as a cron job to keep an eye on what_to_monitor which should always
    # be running. Restart what_to_monitor and send notification as needed.
    #
    # This needs to be run as root or a user that can start system services.
    #
    # Revisions: 0.1 (20100506), 0.2 (20100507)

    NAME=sample_service
    NAME2=sample_service2
    START=/usr/sbin/$NAME
    START2=/usr/sbin/$NAME2
    [email protected]
    [email protected]
    GREP=/bin/grep
    PS=/bin/ps
    NOP=/bin/true
    DATE=/bin/date
    # MAIL=/bin/mail
    RM=/bin/rm

    $PS -ef|$GREP -v grep|$GREP $NAME >/dev/null 2>&1
    case "$?" in
     0)
     # It is running in this case so we do nothing.
      echo "$NAME is RUNNING OK. Relax."

     $NOP
     ;;
     1)
     echo "$NAME is NOT RUNNING. Starting $NAME and sending notices."
     $START 2>&1 >/dev/null &
     NOTICE=/tmp/watchdog.txt
     echo "$NAME was not running and was started on '$DATE'" > $NOTICE
     # $MAIL -n -s "watchdog notice" -c $NOTIFYCC $NOTIFY < $NOTICE
     $RM -f $NOTICE
     ;;
    esac

     # GT06
    $PS -ef|$GREP -v grep|$GREP $NAME2 >/dev/null 2>&1
    case "$?" in
     0)
     # It is running in this case so we do nothing.
      echo "$NAME2 is RUNNING OK. Relax."

     $NOP
     ;;
     1)
     echo "$NAME2 is NOT RUNNING. Starting $NAME2 and sending notices."
     $START2 2>&1 >/dev/null &
     NOTICE=/tmp/watchdog.txt
     echo "$NAME2 was not running and was started on '$DATE'" > $NOTICE
     # $MAIL -n -s "watchdog notice" -c $NOTIFYCC $NOTIFY < $NOTICE
     $RM -f $NOTICE
     ;;
    esac

    exit
    
por 15.09.2012 / 21:26