Logotipo Dicas-L, por Ricardo Burile

Busca

Visite também: UnderLinux ·  VivaOLinux ·  LinuxSecurity ·  NoticiasLinux ·  BR-Linux ·  SoftwareLivre.org ·  [mais]   
 

Você está aqui: Home  → Arquivo Dicas-L

 

Cursos in Company

Assine a Lista Dicas-L

Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.

Analisando a carga de um processo através de gráficos, em shell script!

Colaboração: Pedro R. Bomente Filho

Data de Publicação: 15 de Outubro de 2009

Algumas vezes me deparei com dúvidas relacionadas à carga de CPU que determinado processo tem exigido. Muitas vezes quando testamos algum novo software essa dúvida é iminente. Uma outra situação comum é quando precisamos escolher entre dois softwares e não existe um review sobre os mesmos na rede.

Diante essa necessidade, surgiu-me a ideia de monitorar determinado processo de tempos em tempos para sanar minhas intrigas quanto ao gasto de CPU. Para isso, criei um script o qual tem a finalidade de gerar resultados em um arquivo *.csv. A partir daí, seria fácil manipular os dados. Posteriormente, aprimorando o script recém nascido, pensei: "Por que não criar um gráfico também?!".

Nesse contexto, desenvolvi um script que me foi muito útil. Lá vai!

Inicializações de variáveis:

  I='0'
  # O PID do processo vem como parâmetro 1
  PID=$1
  # O tempo pelo qual o script vai analisar o processo vem como parâmetro 2
  let TEMPO="$2 * 6"
  CSV="/tmp/dadosVerificaProcesso`echo $PID`.CSV"
  GRAFICO="/tmp/grafico`echo $PID`.png"

Gerando o arquivo *.csv:

  while [ "$I" -lt "$TEMPO" ]; do
  ps aux | grep $PID > /tmp/verificaProcesso`echo $PID`.tmp
        while read linha; do
                if [ `echo $linha | awk -F" " '{print $2}'` = "$PID" ];then
                        CPU=$(echo $linha | awk -F" " '{ print $3}')
                        # pode-se também gerar gráficos referentes ao uso de memória
                        mem=$(echo $linha | awk -F" " '{print $4}')
                        echo "$i $CPU" >> /tmp/dadosVerificaProcesso`echo $PID`.CSV
                fi
        done < /tmp/verificaProcesso`echo $PID`.tmp
        sleep 10
        let I="$I + 1"
  done

Montando o gráfico utilizando o gnuplot:

  echo "set terminal png size 400,300" > /tmp/gnuplot`echo $PID`.tmp
  echo "set output '$GRAFICO'" >> /tmp/gnuplot`echo $PID`.tmp
  echo "set grid y" >> /tmp/gnuplot`echo $PID`.tmp
  echo "set title 'Analise Processo $PID'" >> /tmp/gnuplot`echo $PID`.tmp
  echo "set ylabel '%CPU'" >> /tmp/gnuplot`echo $PID`.tmp
  echo "set xlabel 'tempo'" >> /tmp/gnuplot`echo $PID`.tmp
  echo "plot '$CSV' t'' with lines" >> /tmp/gnuplot`echo $PID`.tmp
  gnuplot /tmp/gnuplot`echo $PID`.tmp

A patir daí você pode abrir o gráfico de qualquer computador. Por exemplo analisar determinado processo em um servidor remoto, o script poderia enviar o gráfico por e-mail ao fim do processo.

Pedro R. Bomente Filho é Pesquisador no Laboratório de Pesquisa em Segurança de Redes e Computadores ACME! - IBILCE/UNESP.

Veja a relação completa dos artigos de Pedro R. Bomente Filho

Stumble Upon Digg This Del.icio.us Twitter Recomendar este artigo a um amigo Entre em contato Formato PDF
Newsfeed RSS
Formato para impressão
StumbleUpon Digg Del.icio.us Twitter Recomendar Contato PDF RSS Imprimir

Referências Adicionais

Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.

Avalie esta dica

  • Currently 3.06/5
  • 1
  • 2
  • 3
  • 4
  • 5

Avaliação: 3.1 /5 (62 votos)

Opinião dos Leitores

Arnaldo
16 Out 2009, 11:21
Ops, acabo de reler minhas correções, e numa delas faltou um detalhe essencial: a linha do while é

while read -a linha; do

Silvio Silva
15 Out 2009, 15:35
Excelente script!! muito bom mesmo.

coloquei esta linha no inicio para checar os parâmetros antes.

[ -z "$1" -o -z "$2" ] && echo "Uso : ${0##*/} <PID a ser monitorado>
<Vezes que será checado>" && exit
Allan Carvalho
15 Out 2009, 12:31
Por que ao invés de ps aux | grep $PID você não usa somente ps up $PID?
Arnaldo
15 Out 2009, 10:46
Uma coisa é fazer um script para uso caseiro, outra é divulgar coisa mal feita.

1) Em que shell você escreveu? Já que não diz, vou supor que seja bash.

2) Por que coisas como /tmp/dadosVerificaProcesso`echo $PID`.CSV, quando /tmp/dadosVerificaProcesso$PID.CSV
dá o mesmo resultado e é mais legível?

3) O while é uma piada, sub-utilizando o awk para extrair campos de linhas. Se o script fosse em sh, eu jogaria em um único comando awk o processamento da linha. Em bash, não precisa de nada disso. Bastava escrever

while read linha; do


e aí, horrores como


mem=$(echo $linha | awk -F" " '{print $4}')


se converteriam em

mem=$linha[3]

*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script
Submarino.com.br

Aprenda inglês em casa
Curso estruturado com o que existe de melhor e mais rápido em estratégias e técnicas de aprendizado para adultos.
Conheça as aulas experimentais.