Shell脚本查看进程内存真实占用情况
#!/bin/bash #****************************************************************# #ScriptName:pm #Author:osdba #CreateDate:2010-01-31 #ModifyAuthor: #ModifyDate:2010-01-31 #Function:showprocessesmemoryused #***************************************************************#
functiongetpidmem() { cat/proc/$1/smaps2>/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; } elseif($1~/^Rss:/) { mem_rss=$2; } elseif($1~/^Shared_Clean:/) { mem_shared_clean=$2; } elseif($1~/^Shared_Dirty:/) { mem_shared_dirty=$2; } elseif($1~/^Private_Clean:/) { mem_private_clean=$2; } elseif($1~/^Private_Dirty:/) { mem_private_dirty=$2; } elseif($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); } ' }
functionshow_all_process_mem() { TMPFILE=`/bin/mktemp-q` echo" pid RSS(KB) PRIV_DIRTYPRIV_CLEANSHR_DIRTY SHR_CLEAN SWAP PAGETABLE CMDLINE" echo"-----------------------------------------------------------------------------------------------" ls-ld/proc/[0-9]*|awk'{printf("%s/n",$NF)}'>$TMPFILE whilereadLINE do PID=`basename$LINE` cmdline=`ps-ocommand-p$PID|tail-1 |cut-b1-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); }' }
functionprint_usage() { echo"usage:" echo" pm.sh-a:displayallprocessmemoryinfo" echo" pm.sh-s:displaytotalmemoryinfo" echo" pm.sh-p<pid>:displaypidmemoryinfo" }
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[$#-lt1];then print_usage; exit1 fi
if["$1"="-a"];then show_all_process_mem$1; exit0 fi if["$1"="-s"];then show_all_process_mem$1; exit0 fi
if["$1"="-p"];then if[$#-ne2];then print_usage; exit1 fi
meminfoline=`getpidmem$2` cmdline=`ps-ocommand-p$2|tail-1 |cut-b1-26` pagetablesize=`cat/proc/$2/status|grep"VmPTE:"|awk'{print$2}'` if["$pagetablesize"=""];then pagetablesize=0 fi
echo" pid RSS(KB) PRIV_DIRTYPRIV_CLEANSHR_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); }' exit0 fi