您的位置:首页 > 运维架构

进程内存占用监控脚本

2013-04-26 21:29 441 查看
最近做系统维护的时候,发现系统里面总有那么几个进程的内存占用量不断的在往上涨,直接导致整个系统崩溃。因为该服务器上同时还运行着其他几个服务进程,为了不让其受到影响,就写了个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: