Vilka processer som tar mest minne....
Postat: 05 nov 2021, 18:13
Ett litet enkelt script, som visar vilka processer som tar mest minne (Pss):Det här scriptet bygger alltså på PSS och inte RSS, som ger en något missvisande bild och inte heller "virtual memory", som även det hamnar fel, PSS är nog bäst där. Det ger en balanserad bild av vilka processer som verkligen utnyttjar minnet mest.... 
Jag själv kallar det förresten för "memhogs", i analogi med "nethogs", som för övrigt inte ger info på riktigt samma sätt....
Och om man vill (eller finner det skäligt), så kan man alltid köra "killall" på det som finns under "COMM" eller "CMD"....
Jag kanske har missat något, men det här är hur det ser ut när jag kör det....

[EDIT] Ny version, med några små förändringar....
(Nya versionen finns ovan...)
Kod: Markera allt
#! /bin/bash
#
COUNT=20
#
#####################################################################
#
function usage {
cat << EOD
usage: memhogs [-c COUNT|--count=COUNT] [-h|--help] [-n|--no-header]
-c NUMBER|--count=NUMBER
Number of processes to print out, the default is $COUNT
-h|--help
Print out this.
-n|--no-header
Do not print out header.
EOD
exit
}
#
#####################################################################
#
TEMP=`getopt -oc:hn --long count:,help,noheader -n $(basename $0) -- "$@"`
if [[ $? -ne 0 ]]; then
usage
fi
eval set -- "$TEMP"
NOHEADER=false
CMDNAME=$(basename $0)
while true; do
case $1 in
-c|--count)
shift
COUNT=$1
shift
;;
-h|--help)
usage
exit
;;
-n|--noheader)
NOHEADER=true
shift
;;
--)
shift
break
;;
*)
echo "-Got a star... [$1]"
exit
;;
esac
done
P1=$1
#
#####################################################################
#
#
function btoh {
echo $1 | awk '{sum=$1;
hum[1024**3]="Tb";hum[1024**2]="Gb";hum[1024**1]="Mb";hum[1024**0]="Kb";
for (x=1024**4; x>=1; x/=1024){
if (sum>=x) {
#printf "6.2f %s\n",sum/x,hum[x];break # For fixed length and positions
printf "%.2f %s\n",sum/x,hum[x];break
}
}
}'
}
#
#LINES=$(find /proc/ -maxdepth 1 -name '[0-9]*' -print0 | while read -r -d $'\0' pidpath; do [ -f "${pidpath}/smaps" ] || continue; awk '!/^Private_Dirty:/ {next;} \
LINES=$(find /proc/ -maxdepth 1 -name '[0-9]*' -print0 | while read -r -d $'\0' pidpath; do [ -f "${pidpath}/smaps" ] || continue; awk '!/^Pss:/ {next;} \
$3=="kB" {pd += $2 * (1024^0); next} \
$3=="mB" {pd += $2 * (1024^1); next} \
$3=="gB" {pd += $2 * (1024^2); next} \
$3=="tB" {pd += $2 * (1024^3); next} \
$3=="pB" {pd += $2 * (1024^4); next} \
{print "ERROR!! "$0 >"/dev/stderr"; exit(1)} \
END {printf("%10d: %d\n", '"${pidpath##*/}"', pd)}' "${pidpath}/smaps" || break; done | sort -k2 -n | tail -$COUNT)
IFS='
'
if [[ $NOHEADER == false ]]; then
echo
printf "%-14s%8s %-20s%s\n" "MEMORY" "PID" "COMM" "CMD"
printf "%-14s%8s %-20s%s\n" "------" "---" "----" "---"
fi
for LINE in $LINES; do
PID=$(echo $LINE | awk -F : '{ print $1 }' | xargs)
MEM=$(echo $LINE | awk -F : '{ print $2 }' | xargs)
MEMH=$(btoh $MEM)
COMM=$(ps --pid $PID --no-header -o comm)
CMD=$(ps --pid $PID --no-header -o cmd | awk '{ print $1 }')
printf "%-14s%8d %-20s%s\n" $MEMH $PID $COMM $CMD
done
if [[ $NOHEADER == false ]]; then
echo
fi

Jag själv kallar det förresten för "memhogs", i analogi med "nethogs", som för övrigt inte ger info på riktigt samma sätt....

Och om man vill (eller finner det skäligt), så kan man alltid köra "killall" på det som finns under "COMM" eller "CMD"....
Jag kanske har missat något, men det här är hur det ser ut när jag kör det....

[EDIT] Ny version, med några små förändringar....
(Nya versionen finns ovan...)
