Monitorizar un proceso

De Recursos Educativos
Ir a la navegación Ir a la búsqueda

Pongamos que queremos monitorizar la CPU y memoria que consume un proceso Linux a lo largo del tiempo y no tenemos ninguna herramienta en el servidor, ni munin, ni Cacti, ni nada parecido. O puede que tengamos estas herramientas pero que necesitemos un gráfico con una granularidad de menos de 5 minutos.

Este método no tiene dependencias en el servidor en el que se ejecuta. Una vez generados los datos este ejemplo usa GNUplot para pintar el resultado, pero se podría usar una hoja de cálculo.

Recolectar los datos

Localizamos un string único que nos permita identificar el proceso. Lanzamos:

ps -e -o pid,fname,cmd

y ahí buscamos como vamos a identificar a nuestro proceso (puede contener espacios).

Pongamos que hemos visto que la manera de encontrar el proceso es buscar /usr/lib/virtualbox/VirtualBox --comment tanis64.

En la maquina en la que corra el proceso que nos interesa creamos el siguiente script monitor.sh:

#!/bin/bash

while [[ today != doomsday ]] ;
do
  read -r PID FNAME REST <<<$(ps -e -o pid,fname,cmd | grep "${1}")
  fichero=/tmp/"${FNAME}.$(date +%Y-%m-%d).stats"
  echo -n "$(date +%d-%H:%M:%S) " >> ${fichero}
  ps -e -o pid,pcpu,etime,vsz,osz,rss | grep "${PID}" >> ${fichero}
  sleep 5 ;
done;

Y lo lanzamos asi:

nohup ./monitor.sh "/usr/lib/virtualbox/VirtualBox --comment tanis64" &

Y nos creará un fichero en /tmp/VirtualB.2018-03-30.stats con un aspecto como el siguiente:

30-20:07:59 12128 10.4    04:05:55 5051332 - 2443744
30-20:08:04 12128 10.4    04:06:00 5051332 - 2443740
30-20:08:09 12128 10.4    04:06:05 5051332 - 2443740
30-20:08:14 12128 10.4    04:06:10 5051332 - 2443740
30-20:08:19 12128 10.4    04:06:15 5051332 - 2443740
30-20:08:24 12128 10.4    04:06:20 5051332 - 2443740

Crear el gráfico

Con GNUplot, para la CPU por ejemplo. Creamos el script myplot.sh:

#!/bin/bash

gnuplot << __EOF__
set terminal x11 persist
set style line 1 lt 1 lw 0
set xdata time
set timefmt "%d-%H:%M:%S"
set format x "%H:%M"
plot "$1"  using 1:3 with lines title "CPU Proceso1" ls 1
quit
__EOF__

Y lo lanzamos:

./myplot.sh /tmp/VirtualB.2018-03-30.stats

Que nos daría un gráfico como este:

Grafico01.png

Si queremos pintar mas de un proceso a la vez hay que añadir lineas como estas:

set style line 2 lt 2 lw 0
set style line 3 lt 3 lw 0

Y sustituir la de plot por:

plot "$1" using 1:3 with lines title "Proceso1" ls 1, "$2"  using 1:3 with lines title "Proceso2" ls 2, "$3"  using 1:3 with lines title "Proceso3" ls 3