- #!/bin/bash
- #****************************************************************#
- # ScriptName: pm
- # Function: show processes memory used
- #***************************************************************#
- function getpidmem()
- {
- cat /proc/$1/smaps 2>/dev/null |awk \\
- 'BEGIN{
- total_size=0;
- total_rss=0;
- total_shared_clean=0;
- total_shared_dirty=0;
- total_private_clean=0;
- total_private_dirty=0;
- total_swap=0;
- mem_size=0;
- mem_rss=0;
- mem_shared_clean=0;
- mem_shared_dirty=0;
- mem_private_clean=0;
- mem_private_dirty=0;
- mem_swap=0;
- }
- {
- if($1 ~ /^Size:/)
- {
- mem_size=$2;
- }
- else if($1 ~ /^Rss:/)
- {
- mem_rss=$2;
- }
- else if($1 ~ /^Shared_Clean:/)
- {
- mem_shared_clean=$2;
- }
- else if($1 ~ /^Shared_Dirty:/)
- {
- mem_shared_dirty=$2;
- }
- else if($1 ~ /^Private_Clean:/)
- {
- mem_private_clean=$2;
- }
- else if($1 ~ /^Private_Dirty:/)
- {
- mem_private_dirty=$2;
- }
- else if($1 ~ /^Swap:/)
- {
- mem_swap=$2;
- }
- else
- {
- if(ipcmem_start==1)
- {
- ipc_size=mem_size;
- ipc_rss=mem_rss;
- ipc_shared_clean=mem_shared_clean;
- ipc_shared_dirty=mem_shared_dirty;
- ipc_private_clean=mem_private_clean;
- ipc_private_dirty=mem_private_dirty;
- ipc_swap=mem_swap;
- }
- else
- {
- total_size=total_size+mem_size;
- total_rss=total_rss+mem_rss;
- total_shared_clean=total_shared_clean+mem_shared_clean;
- total_shared_dirty=total_shared_dirty+mem_shared_dirty;
- total_private_clean=total_private_clean+mem_private_clean;
- total_private_dirty=total_private_dirty+mem_private_dirty;
- total_swap=total_swap+mem_swap;
- };
- if($6 ~ /^\\/SYSV/)
- {
- ipcmem_start=1;
- }
- else
- {
- ipcmem_start=0;
- };
- };
- }
- END{
- printf("%15d %15d %15d %15d %15d %15d\\n",total_rss,total_private_clean,total_private_dirty,total_shared_clean,total_shared_dirty,total_swap);
- }
- '
- }
- function show_all_process_mem()
- {
- TMPFILE=`/bin/mktemp -q`
- echo " pid RSS(KB) PRIV_DIRTY PRIV_CLEAN SHR_DIRTY SHR_CLEAN SWAP PAGETABLE CMDLINE"
- echo "--------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------------"
- ls -ld /proc/[0-9]* |awk '{printf("%s\\n",$NF)}' > $TMPFILE
- while read LINE
- do
- PID=`basename $LINE`
- cmdline=`ps -o command -p $PID |tail -1 |cut -b 1-26`
- pagetablesize=`cat /proc/$PID/status |grep "VmPTE:"|awk '{print $2}'`
- if [ "$pagetablesize" = "" ] ; then
- pagetablesize=0
- fi
- meminfoline=`getpidmem $PID`
- rss=`echo $meminfoline |awk '{print $1}'`
- private_clean=`echo $meminfoline |awk '{print $2}'`
- private_dirty=`echo $meminfoline |awk '{print $3}'`
- shared_dirty=`echo $meminfoline |awk '{print $4}'`
- shared_clean=`echo $meminfoline |awk '{print $5}'`
- swap=`echo $meminfoline |awk '{print $6}'`
- total_rss=$((total_rss+rss))
- total_private_clean=$((total_private_clean+private_clean))
- total_private_dirty=$((total_private_dirty+private_dirty))
- total_shared_dirty=$((total_shared_dirty+shared_dirty))
- total_shared_clean=$((total_rss+shared_clean))
- total_swap=$((total_swap+swap))
- total_pagetablesize=$((total_pagetablesize+pagetablesize))
- if [ "$1" = "-a" ] ;then
- echo $PID $meminfoline "$pagetablesize" "$cmdline"|awk \\
- '{
- printf("%9d %10d %10d %10d %10d %10d %10d %10d %-26s\\n",$1,$2,$3,$4,$5,$6,$7,$8,$9);
- }'
- fi
- done <$TMPFILE
- /bin/rm $TMPFILE
- echo $total_rss $total_private_clean $total_private_dirty $total_shared_dirty $total_shared_clean $total_swap $total_pagetablesize | awk \\
- '{
- printf(" ALL %10d %10d %10d %10d %10d %10d %10d\\n",$1,$2,$3,$4,$5,$6,$7);
- }'
- }
- function print_usage()
- {
- echo "usage:"
- echo " pm.sh -a : display all process memory info"
- echo " pm.sh -s : display total memory info"
- echo " pm.sh -p <pid> : display pid memory info"
- }
- total_rss=0
- total_private_clean=0
- total_private_dirty=0
- total_shared_dirty=0
- total_shared_clean=0
- total_swap=0
- total_pagetablesize=0
- if [ $# -lt 1 ];then
- print_usage;
- exit 1
- fi
- if [ "$1" = "-a" ];then
- show_all_process_mem $1;
- exit 0
- fi
- if [ "$1" = "-s" ];then
- show_all_process_mem $1;
- exit 0
- fi
- if [ "$1" = "-p" ];then
- if [ $# -ne 2 ];then
- print_usage;
- exit 1
- fi
- meminfoline=`getpidmem $2`
- cmdline=`ps -o command -p $2 |tail -1 |cut -b 1-26`
- pagetablesize=`cat /proc/$2/status |grep "VmPTE:"|awk '{print $2}'`
- if [ "$pagetablesize" = "" ]; then
- pagetablesize=0
- fi
- echo " pid RSS(KB) PRIV_DIRTY PRIV_CLEAN SHR_DIRTY SHR_CLEAN SWAP PAGETABLE CMDLINE"
- echo "--------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------------"
- echo $2 $meminfoline "$pagetablesize" "$cmdline"|awk \\
- '{
- printf("%9d %10d %10d %10d %10d %10d %10d %10d %-26s\\n",$1,$2,$3,$4,$5,$6,$7,$8,$9);
- }'
- exit 0
- fi
- #该片段来自于http://www.codesnippet.cn/detail/130120148490.html
来源: http://www.codesnippet.cn/detail/130120148490.html