Matar processos com mais de 40 minutos. [RESOLVIDO]

1. Matar processos com mais de 40 minutos. [RESOLVIDO]

Paulo
warz0mbie

(usa Fedora)

Enviado em 02/07/2010 - 10:31h

Bom dia pessoal,
Preciso de um auxílio, pois não tenho muito conhecimento em shellscript.

Na empresa onde eu trabalho, possuímos um sistema de conexão de PDA's, onde cada conexão ativa é um processo dentro do UNIX.
O problema é que muitas conexões ficam presas, e quando a pessoa tenta conectar com o PDA, ela não consegue.
Uma conexão leva em torno de 20~30 minutos, quando eu verifico que há conexões com mais de 40 minutos, tenho de derrubá-las manualmente.

Gostaria de fazer um script que verificasse se o processo está ativo por 40 minutos ou mais, e o derrubasse automaticamente.

Para verificar os processos, utilizo o seguinte comando:
ps -ef -o user -o pid -o start_time |grep skyline |sort +2

skyline 38408282 09:25:24
skyline 35885214 09:48:09
skyline 42451050 09:53:47
skyline 34390070 09:57:00
skyline 35594240 10:01:06
skyline 36540498 10:04:52
skyline 38109362 10:18:44

Agora exatamente são 10:28, podem ver que há várias conexões presas.

Alguém pode me auxiliar? Eu até sei como programar, o problema está sendo encontrar as variáveis do sistema.
Obrigado.


  


2. etime

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 02/07/2010 - 11:14h

Oi Paulo,

O que você procura é algo como:

$ ps -A -o user,pid,etime

etime = elapsed time. Depois é só tratar a saída.

Abraço!


3. Re: Matar processos com mais de 40 minutos. [RESOLVIDO]

Paulo
warz0mbie

(usa Fedora)

Enviado em 02/07/2010 - 12:54h

Opa, obrigado pela resposta.
Eu tinha tentado o etime antes, mas ele não dava certo o horário, pois eu acompanho o tempo das conexões em um outro programa (Skyline). Mas acho que não tem problema, pois tinham alguns processos no 'etime' mostravam que estavam a 50 minutos ativo, eu olhava no Skyline e não tinha nenhum a 50 min. Dei um kill no processo e não encontrou nada, então acho que não vai dar problema.

Mas como eu faria pra ele identificar o processo?

Abraço


4. Procure por sed, awk, ...

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 02/07/2010 - 13:28h

Paulo,

Não entendi muito bem o que você quis dizer, mas o parâmetro "etime" retorna o tempo decorrido dos processos. O que deve ser feito para identificar os que excederam 40min é tratar a saída do comando com o sed, grep, awk,...

Por exemplo, se você quiser listar todos os processos do usuário Skyline mostrando o PID e o tempo decorrido:

$ ps --user skyline -o pid,etime

Trate a coluna de tempo decorrido para identificar os processos (>=40min) e sabendo a linha você saberá o PID. O que pode atrapalhar um pouco é o formato do "etime" que não necessariamente mostra hh:mm:ss, pode acontecer mm:ss, dd:hh:mm:ss, etc.

Talvez exista outra maneira de fazer o que você quer sem usar o ps, pesquise melhor antes de implementar.

Boa sorte!


5. Re: Matar processos com mais de 40 minutos. [RESOLVIDO]

Paulo
warz0mbie

(usa Fedora)

Enviado em 03/07/2010 - 08:26h

Nossa, agora que eu li, nem eu entendi o que tinha escrito no post anterior, hehehe

Mas então, eu ainda não entendi bem, procurei bastante na internet e ainda não encontrei muita coisa que ajude.

Mas a minha dúvida é a seguinte, vamos supor que esse processo esteja ativo a mais de 40 minutos
(skyline 38408282 09:25:24 45:04) aí como eu faria o "if" pra ele verificar?

Fazendo bem robusto, ficaria assim:

if [etime > 40]
then
kill -9 pid
fi

O que eu não estou conseguindo encontrar são as variáveis do sistema.
Como eu faço pra comparar se o etime daquela linha é maior que 40?
Como eu faço pra ele identificar o PID da linha?
Se ele comparar o 'etime' e for matar o processo, ele não iria matar todos que estão rodando na máquina? Como eu faria para matar apenas os processos do usuário 'skyline'

Eu tô pesquisando bastante aqui, mas tenho que fazer só no VI (não tem VIM nem outro editor que eu conheça...), e tá difícil, hehehe

Obrigado pelas respostas.
Abraço.


6. Deve resolver

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 03/07/2010 - 09:06h

Oi Paulo,

Acho que essa linha resolve:

$ kill `ps --user skyline -o pid,etime 2> /dev/null | egrep '(4.:..) | (5.:..) | (..:..:..)' | awk '{print $1}'` 2> /dev/null

Explicação:

ps --user skyline -o pid,etime (Lista todos os processos do usuário skyline mostrando PID e tempo decorrido)

egrep '(4.:..) | (5.:..) | (..:..:..)' (Filtra os processos cujo tempo de execução se apresenta em uma das três condições: aqueles que já completaram 40min (4.:..), aqueles que já completaram 50min (5.:..) e todos os processos que já alcançaram horas em execução (..:..:..))
OBS: os processos que já completaram dias em execução serão também pegos pela última condição.

awk '{print $1}' (Passado o filtro anterior, isto é, os processos que você queria identificar, ele filtra apenas a coluna dos PID's)

2> /dev/null (Aparece duas vezes na linha e simplesmente manda a saída de erro para a "lixeira". No caso de não haverem processos atendendo as condições)

Por fim, o kill irá exterminar todos os processos.

Caso tenha resolvido seu problema, marque o tópico como resolvido.

Abraço!


7. Re: Matar processos com mais de 40 minutos. [RESOLVIDO]

Paulo
warz0mbie

(usa Fedora)

Enviado em 03/07/2010 - 11:12h

Ahhh
Já deu uma clareada pra mim.
Mas só com essa linha ele já mataria o processo?

digitei aqui: kill `ps -u skyline -o pid,etime 2> /dev/null | grep '(3.:..) | (..:..:..)' | awk '{print $1}'` 2> /dev/null

Não deu nenhum erro de sintaxe, mas não derrubou nenhum processo.

Estou fazendo testes aqui.
Valeu pela força.
Abraço.


8. Mataria sim

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 03/07/2010 - 11:27h

Paulo,

Mataria sim, o que você pode fazer é conferir se está filtrando corretamente:

$ ps --user skyline -o pid,etime 2> /dev/null | egrep '(4.:..) | (5.:..) | (..:..:..)' | awk '{print $1}'

Se estiver e mesmo assim não estiver sendo terminado, mande um término forçado (kill -9)


9. Re: Matar processos com mais de 40 minutos. [RESOLVIDO]

Paulo
warz0mbie

(usa Fedora)

Enviado em 03/07/2010 - 13:05h

Não tô conseguindo esse egrep do tempo (4.:..:..)

Como eu faria para ele dar um grep apenas dos processos ativos em 20 minutos?

ps -u skyline -o pid,etime | egrep '(4.:..:..)'

Tentei de várias maneiras e não tá indo.


10. Preste atenção

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 03/07/2010 - 13:27h

É '(4.:..)' e não '(4.:..:..)'

Pelo visto você não entendeu.


11. Re: Matar processos com mais de 40 minutos. [RESOLVIDO]

Paulo
warz0mbie

(usa Fedora)

Enviado em 03/07/2010 - 13:58h

Eu que digitei errado no post.
Coloquei grep '(2.:..)' e não deu liga


12. Preste atenção de novo!

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 03/07/2010 - 14:07h

Paulo,

Leia atentamente o que escrevi: egrep e não grep. Acho que já expliquei o que tinha que ser explicado, só não posso ficar debugando para sempre.

Para mim o tópico já está resolvido.

Abraço!



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts