PS com gráficos por processo
Publicado por Pedro Robson Leão (última atualização em 21/10/2009)
[ Hits: 6.447 ]
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
Conversor de arquivos de vídeo (Video Converter)
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)
Instalar Linux em notebook Sony Vaio VPCEG13EB (13)
Vou destruir sua infância:) (7)
Interface gráfica com problema (0)









