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
Referências Adicionais
Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.
Avalie esta dica
Opinião dos Leitores
16 Out 2009, 11:21
while read -a linha; do
15 Out 2009, 15:35
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
15 Out 2009, 12:31
15 Out 2009, 10:46
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]




