Monitorizar un proceso
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:
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