由于近来线上环境的某些进程总是内存溢出,所以需要添加一下对于某些进程的内存使用情况监控,搜到的别人的脚本大都不太满意,于是自己写了个,代码如下:
1234567891011121314151617181920212223242526272829303132333435363738394041424344 | #!/bin/bash HELP(){ echo " Usage: $0 -p /var/run/pidfile -w used% -c used%" echo " Exam: $0 -p /var/run/pidfile -w 85 -c 90" exit 3 } OK=0 ; WA=1 ; CR=2 ;UN=3 ; WAR=$4 ; CRI=$6 ; MI=${7:-0.9} ; MX=${8:-0.8} #MX:性能数据的CRITICAL线,计算方式为内存总量乘以MX值,此处为0.9等于 当前系统总内存 * 0.9,取结果整数部分 #MI:性能数据的WARNING线,计算方式为内存总量乘以MX值,此处为0.8等于 当前系统总内存 * 0.8,取结果整数部分 DATE= "date +%Y-%m-%d~%k:%M:%S" ; NUL= /dev/null TAG=$1 ; [ "$TAG" != "-p" ] && HELP PID=$2 [ ! -f "$PID" ] && echo "`$DATE` Error: $PID not exist." && HELP if ! ps aux| grep "\<`cat $PID`\>" | grep - v grep &>$NUL; then echo "`$DATE` Error: `cat $PID` not exist." HELP else TOTAL=` /usr/bin/free -m| grep Mem| awk '{print $2}' ` MIN=` echo "$TOTAL * $MI" | /usr/bin/bc | awk -F. '{print $1}' ` MAX=` echo "$TOTAL * $MX" | /usr/bin/bc | awk -F. '{print $1}' ` OSM=` /usr/bin/free -m| grep "\<cache\>" | awk '{print $NF}' ` ID=` cat $PID` BMEM=` /usr/bin/top -bn 1| grep "\<$ID\>" | awk '{print $10}' ` declare -u MMEM=` /usr/bin/top -bn 1| grep "\<$ID\>" | awk '{print $6}' ` RES=` echo "$BMEM > $CRI" | /usr/bin/bc ` if [ "$RES" - eq 1 ]; then echo "CRITICAL - PID:$ID Memory usage = $BMEM% [" $MMEM "B]. OS free memory=" $OSM "MB|Used=" $MMEM "B;" $MIN "MB;" $MAX "MB;0;" $TOTAL "MB" exit $CR fi RES=` echo "$BMEM > $WAR" | /usr/bin/bc ` if [ "$RES" - eq 1 ]; then echo "WARNING - PID:$ID Memory usage = $BMEM% [" $MMEM "B]. OS free memory=" $OSM "MB|Used=" $MMEM "B;" $MIN "MB;" $MAX "MB;0;10877MB" exit $WA else echo "OK - PID:$ID Memory usage = $BMEM% [" $MMEM "B]. OS free memory=" $OSM "MB|Used=" $MMEM "B;" $MIN "MB;" $MAX "MB;0;10877MB" exit $OK fi fi HELP ########## ########## ##能不能吐槽一下这个代码编辑器??? ########## ########## |
测试使用如下:
12 | . /check_mem_pid .sh -p /var/run/hadoop/hdfs/hadoop-hdfs-namenode .pid -w 80 -c 90 OK - PID:5534 Memory usage = 6.6% [720MB]. OS free memory=9179MB|Used=720MB;9789MB;8701MB;0;10877MB |
# -w 指内存使用的warning比例,-c为critical,其大小均为top -bn 1取出的指定pid的第10列字段
不足之处,欢迎指正...
昨天同事又提了点要求,说能不能给这个进程指定可以内存的大小,在可用的范围内监控,所以,今天又修改了下,在nagios服务端执行,结果如下:
123 | # /usr/lib64/nagios/plugins/check_nrpe -H node63 -c check_test -a / var /run/hadoop/hdfs/hadoop-hdfs-namenode.pid 80 90 2048 OK - 719 .59MB / 2048MB. ( 35.14 % used)|Used= 35.14 %;1843MB;1638MB; 0 ;2048MB # 第一个参数是进程pid文件,第二个是warning报警值,第二个critical报警值( 85 就是已用 85 就开始报警),最后一个给监听的目标进程共分配多少内存,单位MB。 |
在本地执行则直接使用脚本如下:
12 | # ./check_mem_pid.sh -p /var/run/hadoop/hdfs/hadoop-hdfs-namenode.pid -w 30 -c 40 -t 2048 WARNING - 719.53MB / 2048MB. (35.13% used)|Used=35.13%;1843MB;1638MB;0;2048MB |
代码就不再列出了,直接上传到附件了(带有nagios相关使用配置文档哦,亲),有兴趣的同学自行下载哈。
脚本下载.zip