Esto debería hacer lo que necesitas. Obtiene la información /proc/$PID/statm
e imprime (desde man procfs
):
size total program size
(same as VmSize in /proc/[pid]/status)
resident resident set size
(same as VmRSS in /proc/[pid]/status)
share shared pages (from shared mappings)
data data + stack
La secuencia de comandos:
#!/usr/bin/env bash
## Print header
echo -e "Size\tResid.\tShared\tData\t%"
while [ 1 ]; do
## Get the PID of the process name given as argument 1
pidno=`pgrep $1`
## If the process is running, print the memory usage
if [ -e /proc/$pidno/statm ]; then
## Get the memory info
m=`awk '{OFS="\t";print $1,$2,$3,$6}' /proc/$pidno/statm`
## Get the memory percentage
perc=`top -bd .10 -p $pidno -n 1 | grep $pidno | gawk '{print \$10}'`
## print the results
echo -e "$m\t$perc";
## If the process is not running
else
echo "$1 is not running";
fi
done
Luego puede llamar al script, dándole un nombre de proceso como entrada. Por ejemplo:
$ memusage.sh firefox
Size Resid. Shared Data %
517193 261902 9546 400715 12.8
517193 261902 9546 400715 12.8
517193 261902 9546 400715 12.8
517193 262100 9546 400715 12.8
517193 262100 9546 400715 12.8
517193 262100 9546 400715 12.8
517209 261899 9546 400731 12.8
517209 261899 9546 400731 12.8
NOTAS
- Esto supone que solo hay un único proceso en ejecución con el nombre especificado.
/proc/$PID/statm
), y luego dormir durante 100 ms y repetir. ¿Por qué no puedes seguir tirando del PID asociadostatm
a través decat
, tal vez utilizar algunas expresiones regulares para filtrar fuera de los valores extra / innecesarios, y acaba de hacer unasleep 0.01
? Algunos sistemas operativos no permitensleep
valores de menos de un segundo , por lo que en ese caso, tendría que tomar la ruta de Python (y usar latime
biblioteca incorporada de Python para dormir).