进程内存占用监控脚本

最近做系统维护的时候,发现系统里面总有那么几个进程的内存占用量不断的在往上涨,直接导致整个系统崩溃。因为该服务器上同时还运行着其他几个服务进程,为了不让其受到影响,就写了个shell脚本,发现有进程的内存占用率达到上限时,就将其杀死。

该脚本可以既可以根据指定的进程号进行监控,也可以根据正则表达式指定进程名进行监控。

具体代码如下:

#! /bin/bash

PNAME=
PID=
MEM=
SEC=1
USAGE="$(basename $0) -[n 进程名] -[p 进程ID] -[s 监视间隔时间(单位:秒)] -[m 内存占用上限(单位:字节,可以通过k,m,g,K,M,G,%指定单位)]"

while getopts n:p:s:m: OPT
do
        case $OPT in
        n)PNAME=$OPTARG
        ;;
        p)PID=$OPTARG
        ;;
        s)SEC=$OPTARG
        ;;
        m)MEM=$OPTARG
        ;;
        \?) echo $USAGE >&2;exit 1
        ;;
        esac 
done

echo $MEM|grep ^[0-9,.]*[0-9,k,m,g,K,M,G,%]$ >/dev/null

if [ $? -gt 0 ];then
        echo "$MEM词法错误" >&2
        echo $USAGE >&2
        exit 1
fi

MEM=$(echo $MEM|tr "[A-Z]" "[a-z]")

len=${#MEM}
unit=$(echo $MEM|cut -c $len)

case $unit in
	k)
	MEM=$(echo $MEM|cut -c 1-$[len-1])
	MEM=$[MEM*1024]
	;;
	m)
	MEM=$(echo $MEM|cut -c 1-$[len-1])
	MEM=$[MEM*1024*1024]
	;;
	g)
	MEM=$(echo $MEM|cut -c 1-$[len-1])
	MEM=$[MEM*1024*1024*1024]
	;;
	%)
	MEM=$(echo $MEM|cut -c 1-$[len-1])
	;;
	\?)
	;;
esac

while true;do
	date
	
	if [ -n "$PID" ];then
	        ents=$(ps -e -o pid= -o vsz= -o pmem= -o pcpu= -o comm=|grep ^$PID)
	elif [ -n "$PNAME" ];then
	        ents=$(ps -e -o pid= -o vsz= -o pmem= -o pcpu= -o comm=|grep $PNAME$) 
	else
	        echo  "指定进程检索条件">&2
	        echo $USAGE >&2
	        exit 1
	fi
	
	if [ -z "$ents" ];then
	        echo "没有符合检索条件的进程"
	        exit 0
	fi
	
	fields=($ents)
	
	echo "符合检索条件的进程信息:"
	echo "【PID】 【VSZ(单位:k)】 【PMEM】 【PCPU】 【COMM】"
	for ((i=0; i<${#fields[@]};i++))
	do
		printf " ${fields[$i]}   "
		if [ $[ i%5 ] -eq 4 ];then
			printf \\n
		fi
	done
	
	#按照内存的占用率进行监控
	if [ $unit == "%" ];then
	        pos=2
	        pmem=${fields[$pos]}
	        while [ -n "$pmem" ];do
	                echo "$pmem $MEM"|awk '($1>=$2){exit 1}'
			if [ $? -eq 1 ];then
	                        pid=${fields[$[pos-2]]}
	                        comm=${fields[$[pos+2]]}
	                        echo "杀死$pid:$comm进程【内存占用率$pmem>=$MEM】"
	                        kill -9 $pid
	                fi
	
	                pos=$[pos+5]
	                pmem=${fields[$pos]}
	        done
	else
	#按照内存的占用量进行监控
	        pos=1
	        vsz=${fields[$pos]}
	        while [ -n "$vsz" ];do
			vsz=$[vsz*1024]
	                if [ $vsz -ge $MEM ];then
	                        pid=${fields[$[pos-1]]}
	                        comm=${fields[$[pos+3]]}
	                        echo "杀死$pid:$comm进程的【内存占用数量$vsz>=$MEM】"
	                        kill -9 $pid
	                fi
	
	                pos=$[pos+5]
	                vsz=${fields[$pos]}
	        done
	fi
	
	echo ""	
	if [ $SEC -gt 0 ];then
		sleep $SEC
	else
		exit 0
	fi
	
done




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值