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 &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值