PS com gráficos por processo
Publicado por Pedro Robson Leão (última atualização em 21/10/2009)
[ Hits: 6.446 ]
Executa monitoração de um determinado processo e gera um gráfico para análise. Utiliza gnuplot e imagemagick.
Boa alternativa para monitoração de um determinado processo.
#!/bin/bash
# psChart
# baseado em http://www.dicas-l.com.br/dicas-l/20091015.php
#
# by Pedro Robson Leao
#
# Dependencas: gnuplot, display, convert
#::::::::::::::
#abc.csv
#::::::::::::::
#5 30
#10 28.5
#20 3
#25 15
#30 17.5
#::::::::::::::
#abc.plot
#::::::::::::::
#set terminal png size 400,300
#set output 'abc.png'
#set grid y
#set title 'TESTE'
#set ylabel 'Y'
#set xlabel 'X'
#plot 'abc.csv' t'' with lines
# Variaveis SVN
SVN_REVISION='$Revision: 17854 $'
SVN_LASTCHANGE='$Date: 2009-04-13 19:38:52 -0300 (Mon, 13 Apr 2009) $'
VERSION="pscht v1.0.0 (19/10/2009)";
function usage() {
printf "Use: ${PRG} <option,...> PID\n\n\t--help\n\t--time [seconds]\n\t--interval [seconds]\n\t--version\n\n";
printf "Default:\n\ttime = ${TIME}\n\tinterval = ${INTERVAL}\n"
}
function showVersion() {
echo "Version: ${VERSION}";
echo "$SVN_REVISION" | awk '{printf("Svn Revision: %s\n", $2);}';
echo "$SVN_LASTCHANGE" | awk '{printf("Svn Date: %s %s %s\n", $2, $3, $4);}';
echo;
}
PRG=${0};
BASEPRG="$( basename ${PRG} .sh )";
TIME=60; #tempo default 60 segundos
INTERVAL=5; #intervalo defalt 5 segundos
#CMD="ps aux";
CMD="ps -e -o pid,pcpu,pmem,size,rsz,vsize,thcount,cmd";
#PLOT="%CPU %MEM VSZ";
PLOT="%CPU %MEM SZ RSZ VSZ THCNT";
[ -f ~/${BASEPRG}.rc ] && source ~/${BASEPRG}.rc;
# Parametros longos
set -- ${@//--help/-h};
set -- ${@//--time/-t};
set -- ${@//--interval/-i};
set -- ${@//--version/-v};
while getopts hvt:h: opc ; do
case ${opc} in
t) TIME="${OPTARG}";;
i) INTERVAL="${OPTARG}";;
h) usage && exit 0;;
v) showVersion; exit 0;;
*) usage && exit 1;;
esac
done
_HEADER=( $( ${CMD} | head -1 ) );
shift $(($OPTIND - 1))
PID=${1};
[ -z "${PID}" ] && usage && exit 1;
function find() {
local key="${1}";
local i=0;
local tot=${#_HEADER[@]};
for ((i=0;i<tot;i++)) {
[ "${key}" == "${_HEADER[$i]}" ] && {
echo $i;
return
}
}
echo 255;
}
function mkchart() {
local pid="${1}";
local ppid="${2}";
local data=$$.${pid}.csv;
local chart=$$.${pid}.png;
local plot=$$.${pid}.plot;
local date=$( date +'%d/%m/%Y %H:%M:%S' )
local key=;
### debug
echo "${_HEADER[@]}";
for ((i=0;i<TIME;i+=INTERVAL)) {
RES=( $( ${CMD} | grep -w ${pid} | egrep -wv "grep|${PRG}|tee" ) );
### debug
echo "${RES[@]}";
for key in ${PLOT} ; do
local idx=$( find "${key}" );
[ "${idx}" != "255" ] && {
#echo "$i ${key} ${RES[$idx]}";
echo "$i ${RES[$idx]}" >>/tmp/.${key}.${data};
}
done
sleep ${INTERVAL};
}
for key in ${PLOT} ; do
[ -f /tmp/.${key}.${data} ] && {
cat >>/tmp/.${key}.${plot} <<EOF
set terminal png size 400,300
set output '/tmp/.${key}.${chart}'
set grid y
set title '${key} ${date} $( date +'%d/%m/%Y %H:%M:%S' )'
set ylabel '${key}'
set xlabel 'Interval'
plot '/tmp/.${key}.${data}' t'' with lines
EOF
gnuplot /tmp/.${key}.${plot} 2>/dev/null;
}
done
convert -append /tmp/.*.${ppid}.*png ${BASEPRG}.${pid}.$( date +%Y%m%d-%H%M%S ).png;
rm -f /tmp/.*.${ppid}.*;
}
mkchart ${PID} $$ | tee -a ${BASEPRG}.${PID}.$( date +%Y%m%d-%H%M%S ).log
Dicionário e tradutor baseado no Michaelis
Cadastro de usuarios para proxy autenticado
diMail - envia e-mail com um front do dialog
tuiteroPreguicoso1.0 - automatiza o envio de mensagens ao Twitter
arrcomb: Gerando Arranjos e Combinações
KDE Plasma - porque pode ser a melhor opção de interface gráfica
Gentoo: detectando impressoras de rede e como fixar uma impressora por IP
Como o GNOME conseguiu o feito de ser preterido por outras interfaces gráficas
Por que sua empresa precisa de uma PKI (e como automatizar EMISSÕES de certificados via Web API)
Instalando NoMachine no Gentoo com Systemd (acesso Remoto em LAN)
Gentoo: Trocando wpa_supplicant pelo iwd no NetworkManager (Systemd)
Instalar Linux em notebook Sony Vaio VPCEG13EB (10)
Vou destruir sua infância:) (6)
Quando vocês pararam de testar distros? (24)









