Skip to content

Watchdog mínimo em shell

20/07/2009

O @ThalesPinheiro da PaPonline (o que ganhou a promoção) me pediu para fazer um programa que checasse se outro programa está rodando de tempos em tempos e, caso não estivesse, que o executasse de novo, em outras palavras, um watchdog.

Terminal 1 X 0 GUI

Terminal 1 X 0 GUI

Como o programa monitorado rodaria sob Linux e era um problema relativamente simples me propus a fazer o watchdog em shell script mesmo. Inicialmente pensei em fazer um script com fluxo de execução paralelo ao programa, fazendo uma verificação a cada intervalo de tempo de acordo com o que foi passado como parâmetro para o script.

Com o script já pronto me ocorreu que recursividade seria bem melhor nesse caso, afinal ficar verificando uma coisa que o shell pode disparar, como um evento, é um trabalho bem idiota. O resultado ficou assim (parecido com um outro programa bem famoso):

#!/bin/bash
x=$*;:(){ $x;:;};:

Entendeu? Não?! Eu explico. A primeira linha do programa é só pra indicar ao terminal que aquele arquivo deve ser executado com o bash, o shell favorito de 11/10 linuxeiros. Na linha de baixo eu declaro uma variável x que recebe os parâmetros passados ao script, que é o comando a ser executado. Por exemplo:

$ ./watchdog.sh servidor_xyz -porta 8080

No exemplo o conteúdo de x é igual a “servidor_xyz -porta 8080“. Mais adiante eu defino a função : (dois pontos) que é basicamente uma função que executa o comando passado ao script e quando a execução termina, por qualquer motivo, a função faz recursividade, ou seja, chama ela mesma. Após encerrar a declaração da função eu a executo e pronto, acabou o programa.

Sintaxe, sintaxe; algoritmos à parte. Se você não conhece shell script pode ser que alguma coisa não tenha ficado clara, mas o objetivo deste artigo não é ensinar shell script. Aqui você encontra alguns cheatsheets que podem te ajudar a entender melhor a sintaxe.

O resultado não é perfeito. Se você quiser encerrar o script pode ser que não consiga e precise matar o terminal que o chamou para pará-lo, mas como eu o fiz na intenção de ser algo bem simples acho que não há necessidade de me preocupar com isso. Em alguns casos isso pode se tornar uma feature, tipo, ao rodar um fork bomb.🙂

4 Comentários leave one →
  1. 22/07/2009 11:35

    Estou aqui para fazer-lhe uma proposta, que eu considero interessante.Também sou TOP 100 e estou concorrendo na categoria “VARIEDADES” e estou na campanha “UM VOTO POR UM VOTO”.O legal disso tudo é essa interação,eu conheço seu blog e vc, o meu.Já votei no seu e sei que também que receberei seu voto.
    Estou te seguindo e se quiseres me seguir, ficarei honrada.Venha apanhar um brinde, com assinatura de um design.Sua presença é muito importante para nós.
    Obrigada

    • Perini permalink
      22/07/2009 13:19

      Obrigado pelo seu voto mas só votamos em quem merece. Campanha de voto por um voto não é ético. E deveria ter usado nosso email de contato.

  2. 12/08/2009 22:13

    KKKKKKKKK
    MIJADA ONLINE! Que onda essa do voto hein… Ô menina conversadora… largou um copi-cola no queixo duro! hauhuaha

    Mas então, n foi por isso q estou comentando…
    Quando eu vi a segunda linha de seu script eu pensei que ia fazer um fork-bomb!

    Agora, não seria interessante criar um serviço?

    • 12/08/2009 22:54

      Pode ser, nem tinha pensado nisso… apesar de gostar de fuçar e ler sobre o assunto (arquitetura do GNU/Linux) nunca me interessei muito pela parte de serviços, inittab, cron e essas coisas.

      Tem algum exemplo de como fazer isso com serviços dando sopa aí?

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: