Diferencia entre revisiones de «Monitorizar un proceso»
(Página creada con «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 [https://en.wikipe...») |
Sin resumen de edición |
||
(No se muestran 4 ediciones intermedias del mismo usuario) | |||
Línea 1: | Línea 1: | ||
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 [ | 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 [[wikipedia:Cacti_(software)|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 [ | 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 == | == Recolectar los datos == | ||
En la maquina en la que corra el proceso | 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 <code>/usr/lib/virtualbox/VirtualBox --comment tanis64</code>. | |||
En la maquina en la que corra el proceso que nos interesa creamos el siguiente script <code>monitor.sh</code>: | |||
<pre> | <pre> | ||
Línea 12: | Línea 20: | ||
while [[ today != doomsday ]] ; | while [[ today != doomsday ]] ; | ||
do | do | ||
fichero= | 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} | echo -n "$(date +%d-%H:%M:%S) " >> ${fichero} | ||
ps -e -o | ps -e -o pid,pcpu,etime,vsz,osz,rss | grep "${PID}" >> ${fichero} | ||
sleep 5 ; | sleep 5 ; | ||
done; | done; | ||
Línea 21: | Línea 30: | ||
Y lo lanzamos asi: | Y lo lanzamos asi: | ||
nohup ./monitor.sh & | nohup ./monitor.sh "/usr/lib/virtualbox/VirtualBox --comment tanis64" & | ||
Y nos creará un fichero en <code>/tmp/VirtualB.2018-03-30.stats</code> con un aspecto como el siguiente: | |||
<pre> | |||
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 | |||
</pre> | |||
== Crear el gráfico == | |||
Con [[wikipedia:Gnuplot|GNUplot]], para la CPU por ejemplo. Creamos el script <code>myplot.sh</code>: | |||
<pre> | <pre> | ||
#!/bin/bash | |||
gnuplot << __EOF__ | gnuplot << __EOF__ | ||
set terminal | set terminal x11 persist | ||
set style line 1 lt 1 lw 0 | set style line 1 lt 1 lw 0 | ||
set xdata time | set xdata time | ||
set timefmt "%d-%H:%M:%S" | set timefmt "%d-%H:%M:%S" | ||
set format x "%H:%M" | set format x "%H:%M" | ||
plot "$1" using 1: | plot "$1" using 1:3 with lines title "CPU Proceso1" ls 1 | ||
quit | quit | ||
__EOF__ | __EOF__ | ||
</pre> | </pre> | ||
Y lo lanzamos: | |||
./myplot.sh /tmp/VirtualB.2018-03-30.stats | |||
Que nos daría un gráfico como este: | |||
[[Archivo: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 | |||
[[Category:Tips]] | [[Category:Tips]] | ||
[[Category: | [[Category:Tecnologia]] | ||
[[Category:Linux]] | [[Category:Linux]] |
Revisión actual - 10:37 4 dic 2018
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:
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