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...)