#!/bin/bash
# memtop v1.0 Oct 16 2012
# Author: Justin L. Franks (justin.franks@gmail.com)
# http://justinfranks.com
# memtop shows processes with the highest memory usage in human-readable form
# (sizes in KB/MB/GB), sorted from largest to smallest.
#
# By default, memtop shows all processes, but this can be changed via the "-n"
# parameter.
#
# For example, to show the top 20 processes by memory usage:
#
# memtop -n 20
# Copyright (c) 2012 Justin L. Franks
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# The GNU General Public License is available at:
# http://www.gnu.org/copyleft/gpl.html
while getopts n: option
do
case "${option}" in
n)
COUNT=${OPTARG}
;;
esac
done
printf "%$(tput cols)s\n" | tr ' ' '=';
printf "Memory%-6sPID%-5sUser%-7sCommand\n";
printf "%$(tput cols)s\n" | tr ' ' '-';
ps -eo size,pid,user,command | sed "1 d" | sort -rn | if [[ -n $COUNT ]]; then head -n $COUNT; else cat; fi | \
awk '
{
units[1024**2] = "GB";
units[1024] = "MB";
units[1] = "KB";
for (x = 1024**3; x >= 1; x /= 1024) {
if ($1 >= x) {
if (x < 1024) {
printf ("%-6.0f %-4s ", $1/x, units[x]);
}
else {
printf ("%-6.2f %-4s ", $1/x, units[x]);
}
break;
}
}
}
{
printf ("%-7s %-10s ", $2, $3);
}
{
for (x = 4; x <= NF; x++) {
printf ("%s ", $x);
}
print ("\r");
}
';
printf "%$(tput cols)s\n"|tr ' ' '=';