天天看点

Shell脚本编程——用smaps监控进程内存

    操作系统的资源总是有限,必要时可进行监视,也有利于调查一些问题。内存监控的工具除了全能的top、ps、vmstat之外,还有几个专用的工具:

free

/proc/meminfo

/proc/<pid>/smaps

    以监控进程的使用内存为例。在统计某个进程的内存使用时,可以利用smaps,它包含了该进程目标程序和共享库的内存分配和使用。监控时,分别统计shared和private部分的内存,然后相加就是该进程使用的内存。其中,shared包含clean和dirty两部分,private也一样。

    监控进程内存的脚本mem_monitor.sh, 每隔10s输出变化后的内存使用状况。源码如下:

#! /bin/sh

PROCNAME=$1
PROCID=`ps -ef | grep $PROCNAME | grep -v grep | grep -v /bin/sh | awk '{print $2}'`
LOG_FILE=${PROCNAME}_memory.log
TEMP=0

while true; do
        cd /proc/$PROCID

        Shared_Clean=`cat smaps | grep Shared_Clean | awk 'BEGIN{x=0} {x=x+$2} END{print x}'`
        Shared_Dirty=`cat smaps | grep Shared_Dirty | awk 'BEGIN{x=0} {x=x+$2} END{print x}'`
        Private_Clean=`cat smaps | grep Private_Clean | awk 'BEGIN{x=0} {x=x+$2} END{print x}'`
        Private_Dirty=`cat smaps | grep Private_Dirty | awk 'BEGIN{x=0} {x=x+$2} END{print x}'`
 
        SHARED_TOTAL=`expr $Shared_Clean + $Shared_Dirty`
        PRIVATE_TOTAL=`expr $Private_Clean + $Private_Dirty`
        TOTAL=`expr $SHARED_TOTAL + $PRIVATE_TOTAL`
        
        if [ "${TEMP}" != "${TOTAL}" ]; then    
            CURRDATE=`date`
            echo "pid: $PROCID, Name: $PROCNAME, Date: $CURRDATE"
            echo "Shared: $SHARED_TOTAL kB, Private: $PRIVATE_TOTAL kB, Total: $TOTAL kB"
            TEMP="${TOTAL}"
        fi
 
        sleep 10
done >> ~/$LOG_FILE

           

    测试运行:

./mem_monitor.sh myprocess &