Killar programa por inatividade. [RESOLVIDO]

1. Killar programa por inatividade. [RESOLVIDO]

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 19/05/2012 - 17:08h

Olá pessoal,
Tenho um probleminha interessante aqui.
Tenho um pequeno programinha no servidor que fica verificando
o status de outras máquinas.
A cada 10 segundos ele printa no prompt se está ok ou se não está respondendo.
O meu problema é que as vezes esse programinha trava, não mostra "ok" nem "não responde" na tela,
simplesmente trava por motivos que ainda não sei. Aí eu tenho que periodicamente ficar olhando
se ele não travou, e se travou preciso kilar o danado e iniciar de novo. O problema é que não tenho
tempo de ficar olhando toda hora se ele travou ou não, e as vezes quando olho ele já tá a muito tempo parado
e isso prejudica um relatorio final que geramos, que é baseado na quantidade de "ok" e "não responde" das nossas máquinas.


Então, o que eu gostaria que vcs me dessem uma idéia, é como killar esse programa através de algum script,
que verificaria se o terminal não apresentasse nenhuma mensagem dentro de 1 minuto, então killa meu programinha
e o inicia de novo.

Eu já vi aqui um começo, com o comando w eu consigo ver todos os prompts abertos

SER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 12:34 3:11m 1:07 0.00s /bin/bash /usr/
root pts/0 :0.0 12:37 19:26 0.37s 0.37s bash
root pts/1 :0.0 13:02 1:59 0.10s 0.10s bash
root pts/2 :0.0 13:26 7:21 51.74s 51.08s /usr/bin/python
root pts/3 :0.0 15:46 0.00s 0.00s 0.00s w

Ou seja, nesse caso tenho 4 terminais abertos executando tarefas diversas, e nosso querido e complicado programinha
está aqui no pts/2

Então precisaria de um script que monitorasse a saída do pts/2, e se dentro de 1 minuto nada aparecer (o que indica que o danado travou)
daria um

killall -9 python; python monitora.py

É isso ai. Se alguem puder me dar uma luz, fico eternamente agradecido.
Valeu.


  


2. MELHOR RESPOSTA

M4iir1c10
m4iir1c10

(usa Arch Linux)

Enviado em 19/05/2012 - 20:33h

De acordo com oque voce mandou eu escrevi esse script ve se funciona para o seu proposito


#!/bin/bash
linhas=$(cat check.txt | wc -l)
saida=$(expr $linhas)

while [ 1 = 1 ]
do echo "Aguardando"
sleep 59
linhas=$(cat check.txt | wc -l)

if [ $linhas -ne $saida ]
then echo "Esta funcionando"
let saida=$(expr $linhas)
else echo "Nao esta funcionando."
kill -9 $(ps axo pid,cmd | grep monitora.py | awk '{print $1}')
python monitora.py | tee check.txt
saida=$(expr $linhas)
fi

saida=$(expr $linhas)
done


3. Re: Killar programa por inatividade. [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 19/05/2012 - 17:22h

Bom, não entendo muito de shell script, mas segue minha ideia.

Se ele guarda os OK's em um arquivo, pode verificar o número de linhas ou de OK's, fazendo um loop infinito que execute o script que conte essas linhas. Se não houver mudança na quantidade de linhas em uma ou duas passagens, o script executa o kill e reinicia o monitora.py, além de seguir a contagem das linhas ou OK's.


4. Re: Killar programa por inatividade. [RESOLVIDO]

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 19/05/2012 - 17:35h

Fala Rei,
então, esse arquivo contem tambem outras informaçoes do sistema que são geradas por outros aplicativos, sua idéia
daria certo se ele fosse exclusivo da aplicação, mas não é....
entao eu preciso mesmo resolver com minha idéia inicial, que acho que vai ser bem intrigante.


5. Re: Killar programa por inatividade. [RESOLVIDO]

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 19/05/2012 - 17:50h

Pensando aqui no que o rei disse,
comecei a pensar alguns caminhos,
por exemplo no /dev/pts tem todos os
terminais em execução, como pode ser observado no meu caso:

crw--w---- 1 root tty 136, 0 2012-05-19 16:26 0
crw--w---- 1 root tty 136, 1 2012-05-19 16:26 1
crw--w---- 1 root tty 136, 2 2012-05-19 16:45 2
crw--w---- 1 root tty 136, 3 2012-05-19 16:45 3
crw--w---- 1 root tty 136, 4 2012-05-19 16:45 4
c--------- 1 root root 5, 2 2012-05-19 12:23 ptmx

o danado está no 2, será q tem como eu pegar as ultimas saidas do terminal? algo do estilo "tail"?
se isso for possivel eu posso fazer isso duas vezes, salvar em arquivo e comparar, se for igual ai travou.
já é uma idéia.

mas ai me falta saber se tem como capturar as ultimas coisas que sairam do 2.

idéias?



6. Meio caminho andado.

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 19/05/2012 - 18:30h

Pessoal, consegui parcialmente.
pesquisando aqui achei o comando tee.

o tee serve para mostar o comando na tela e salvar essa saída em um arquivo.

então tenho:
python monitora.py | tee check.txt

a partir desse momento, tudo que estiver na tela, será gravado no check.txt

meio caminho andado.
com um wc -l podemos verificar quantas linhas o check.txt tem.

o problema é que como sou iniciante não sou muito bom no shell script, mas a idéia eu já bolei.

script
wc -l check.txt
(retorna 20 linhas)
<guarda 20 na variavel linhas>
<aguarda 1 minuto>
saida = 0
-----Repita até saida = 1-----
wc -l check.txt
(retorna 30 linhas)
<compara a variavel linhas com 30>
==se==
<se for diferente, linhas=30>
<aguarda 1 minuto>
==fim se==

===Senão===
<se linhas igual a 30> //depois de 1 minuto o arquivo nao cresceu, entao travou o programa.
<killall -9 python>
saida =1
===Fim Senão===
-----Fim Repita-----
<python monitora.py | tee chek.txt>

bom, só não sei fazer isso agora em shell script... =/



7. opa

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 20/05/2012 - 01:55h

Grande m4iir1c10,
Funciounou certinho.
obrigado parceiro.
agora vou estudar cada comando q vc fez pra ir aprendendo.
valeu!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts