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 [[wikipedia:Munin_(software)|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 [[wikipedia:Gnuplot|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