PS com gráficos por processo

Publicado por Pedro Robson Leão (última atualização em 21/10/2009)

[ Hits: 6.109 ]

Download pscht




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.

  



Esconder código-fonte

#!/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

Scripts recomendados

Fazer backup da trilha mbr

Rotação de Arquivos de Log

Backup bases de dados Firebird com envio via FTP e local

Descobrir se um número é par ou impar

Copia arquivos distribuidos em pastas diferentes para uma única pasta.


  

Comentários
[1] Comentário enviado por alexandrefnds em 28/05/2012 - 21:38h

Excelente Script.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts