#!/bin/bash ############### # DESCRIPTION: list top 25 memory consuming processes # values can be very wrong, see https://stackoverflow.com/a/131346/2656118 # switching to manual calculation from /proc/X/smaps could help ############### set -euo pipefail TOPPIDS=$(grep VmSize /proc/*/status |sed -r 's/[^0-9 \t]//g' |sort -n -r -k2 |grep -Pv '[^0-9]0[ \t]*$' |head -n25) printf " MEM/KB PID PPID USER %%MEM COMMAND\n" OIFS="$IFS"; IFS=$'\n' for TOPPID in $TOPPIDS; do TPID=$(echo "$TOPPID" |awk '{print $1}') TMEM=$(echo "$TOPPID" |awk '{print $2}' |rev |sed -r 's/(.{3})/\1./g;s/\.$//g' |rev) LEN=$(( 15 - $(printf "$TMEM" |wc -c ) )) TSPACE=""; for (( i=0; i<$LEN; i++ )); do TSPACE+=" "; done TWIDTH=$(( $(tput cols) - 17 )) printf "$TSPACE${TMEM} " ps -o pid= -o ppid= -o user= -o pmem= -o args= -p $TPID |sed -r "s/(.{$TWIDTH}).+$/\1/g" done; IFS="$OIFS"