LINUX

Shell Script para verificar el uso de la memoria (RAM)

En este tutorial, mostraré un script de shell para verificar el uso de memoria para cada programa o aplicación en Linux. El script genera memoria compartida y privada para cada programa que se ejecuta en Linux. Dado que el cálculo de la memoria es un poco complejo, este script de shell intenta encontrar resultados más precisos.

Este script usa 2 archivos, es decir, ‘/proc/../status’ (para obtener el nombre del proceso) y ‘/proc/../smaps’ para la estadística de memoria del proceso. Luego, el script convertirá todos los datos en Kb, Mb, Gb. Además, asegúrese de instalar el comando bc.

Puede descargar el script de uso de memoria de Linux en versión pdf y el script también está disponible en Github.

Secuencia de comandos de shell para comprobar el uso de la memoria

Verifique el siguiente script que calcula el uso de memoria y los resultados de impresión.

#!/bin/bash
# Make sure only root can run our script

if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root" 1>&2
exit 1
fi

### Functions
#This function will count memory statistic for passed PID
get_process_mem ()
{
PID=$1
#we need to check if 2 files exist
if [ -f /proc/$PID/status ];
then
if [ -f /proc/$PID/smaps ];
then
#here we count memory usage, Pss, Private and Shared = Pss-Private
Pss=`cat /proc/$PID/smaps | grep -e "^Pss:" | awk '{print $2}'| paste -sd+ | bc `
Private=`cat /proc/$PID/smaps | grep -e "^Private" | awk '{print $2}'| paste -sd+ | bc `
#we need to be sure that we count Pss and Private memory, to avoid errors
if [ x"$Rss" != "x" -o x"$Private" != "x" ];
then

let Shared=${Pss}-${Private}
Name=`cat /proc/$PID/status | grep -e "^Name:" |cut -d':' -f2`
#we keep all results in bytes
let Shared=${Shared}*1024
let Private=${Private}*1024
let Sum=${Shared}+${Private}

echo -e "$Private + $Shared = $Sum t $Name"
fi
fi
fi
}

#this function make conversion from bytes to Kb or Mb or Gb
convert()
{
value=$1
power=0
#if value 0, we make it like 0.00
if [ "$value" = "0" ];
then
value="0.00"
fi

#We make conversion till value bigger than 1024, and if yes we divide by 1024
while [ $(echo "${value} > 1024"|bc) -eq 1 ]
do
value=$(echo "scale=2;${value}/1024" |bc)
let power=$power+1
done

#this part get b,kb,mb or gb according to number of divisions
case $power in
0) reg=b;;
1) reg=kb;;
2) reg=mb;;
3) reg=gb;;
esac

echo -n "${value} ${reg} "
}

#to ensure that temp files not exist
[[ -f /tmp/res ]] && rm -f /tmp/res
[[ -f /tmp/res2 ]] && rm -f /tmp/res2
[[ -f /tmp/res3 ]] && rm -f /tmp/res3

#if argument passed script will show statistic only for that pid, of not – we list all processes in /proc/ #and get statistic for all of them, all result we store in file /tmp/res
if [ $# -eq 0 ]
then
pids=`ls /proc | grep -e [0-9] | grep -v [A-Za-z] `
for i in $pids
do
get_process_mem $i >> /tmp/res
done
else
get_process_mem $1>> /tmp/res
fi

#This will sort result by memory usage
cat /tmp/res | sort -gr -k 5 > /tmp/res2

#this part will get uniq names from process list, and we will add all lines with same process list
#we will count nomber of processes with same name, so if more that 1 process where will be
# process(2) in output
for Name in `cat /tmp/res2 | awk '{print $6}' | sort | uniq`
do
count=`cat /tmp/res2 | awk -v src=$Name '{if ($6==src) {print $6}}'|wc -l| awk '{print $1}'`
if [ $count = "1" ];
then
count=""
else
count="(${count})"
fi

VmSizeKB=`cat /tmp/res2 | awk -v src=$Name '{if ($6==src) {print $1}}' | paste -sd+ | bc`
VmRssKB=`cat /tmp/res2 | awk -v src=$Name '{if ($6==src) {print $3}}' | paste -sd+ | bc`
total=`cat /tmp/res2 | awk '{print $5}' | paste -sd+ | bc`
Sum=`echo "${VmRssKB}+${VmSizeKB}"|bc`
#all result stored in /tmp/res3 file
echo -e "$VmSizeKB + $VmRssKB = $Sum t ${Name}${count}" >>/tmp/res3
done

#this make sort once more.
cat /tmp/res3 | sort -gr -k 5 | uniq > /tmp/res

#now we print result , first header
echo -e "Private t + t Shared t = t RAM used t Program"
#after we read line by line of temp file
while read line
do
echo $line | while read a b c d e f
do
#we print all processes if Ram used if not 0
if [ $e != "0" ]; then
#here we use function that make conversion
echo -en "`convert $a` t $b t `convert $c` t $d t `convert $e` t $f"
echo ""
fi
done
done < /tmp/res

#this part print footer, with counted Ram usage
echo "--------------------------------------------------------"
echo -e "tttttt `convert $total`"
echo "========================================================"

# we clean temporary file
[[ -f /tmp/res ]] && rm -f /tmp/res
[[ -f /tmp/res2 ]] && rm -f /tmp/res2
[[ -f /tmp/res3 ]] && rm -f /tmp/res3

Salida de script de shell

He nombrado este script como ‘memstat.sh’ y encuentro el resultado ejecutando el script de la siguiente manera:

[root@centos-cluster-node1 ~]# ./memstat.sh
Private + Shared = RAM used Program
36.26 mb + 268.00 kb = 36.52 mb python
20.49 mb + 238.00 kb = 20.72 mb iscsiuio
4.78 mb + 451.00 kb = 5.22 mb rgmanager(2)
3.62 mb + 283.00 kb = 3.90 mb NetworkManager
2.53 mb + 1.36 mb = 3.89 mb sshd(3)
2.30 mb + 355.00 kb = 2.64 mb multipathd
2.25 mb + 176.00 kb = 2.42 mb hald
1.69 mb + 298.00 kb = 1.98 mb iscsid(2)
1.45 mb + 432.00 kb = 1.87 mb dhclient(3)
1.62 mb + 161.00 kb = 1.77 mb cupsd
704.00 kb + 819.00 kb = 1.48 mb udevd(3)
856.00 kb + 554.00 kb = 1.37 mb bash(2)
1.00 mb + 314.00 kb = 1.31 mb qmgr
984.00 kb + 314.00 kb = 1.26 mb pickup
976.00 kb + 316.00 kb = 1.26 mb master
1.07 mb + 21.00 kb = 1.09 mb rsyslogd
804.00 kb + 240.00 kb = 1.01 mb modem-manager
904.00 kb + 40.00 kb = 944.00 kb pcscd
804.00 kb + 33.00 kb = 837.00 kb ricci
788.00 kb + 38.00 kb = 826.00 kb dbus-daemon
660.00 kb + 32.00 kb = 692.00 kb crond
536.00 kb + 69.00 kb = 605.00 kb rpc.statd
528.00 kb + 46.00 kb = 574.00 kb init
216.00 kb + 357.00 kb = 573.00 kb saslauthd(5)
544.00 kb + 21.00 kb = 565.00 kb wpa_supplicant
484.00 kb + 72.00 kb = 556.00 kb mingetty(6)
316.00 kb + 58.00 kb = 374.00 kb rpcbind
116.00 kb + 237.00 kb = 353.00 kb memstat.sh
328.00 kb + 13.00 kb = 341.00 kb auditd
248.00 kb + 84.00 kb = 332.00 kb hald-runner
312.00 kb + 8.00 kb = 320.00 kb oddjobd
216.00 kb + 81.00 kb = 297.00 kb hald-addon-stor
196.00 kb + 88.00 kb = 284.00 kb hald-addon-inpu
272.00 kb + 4.00 kb = 276.00 kb rpc.idmapd
176.00 kb + 52.00 kb = 228.00 kb hald-addon-acpi
--------------------------------------------------------
98.57 mb
========================================================
[root@centos-cluster-node1 ~]#

Leer también: Shell Script para verificar el estado del servidor Linux

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar