JVM記憶體監控shell指令碼
JVM記憶體監控shell指令碼,該shell指令碼主要用於監控各個程序的jvm記憶體使用情況,指令碼名稱:jvm-monitor.sh,具體指令碼如下:
[root@loong /]#more jvm-monitor.sh
#!/bin/bash
export JAVA_PATH=/callcent/jdk1.6.0_25
export PATH=$PATH:$JAVA_PATH/bin:/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/mit/bin:/usr/lib/mit/sbin
sysdate=date
for pid in jps -v |grep weblogic|grep -v AdminServer |awk '{print $1}'
do
addr=ifconfig -a|grep -w inet|grep -v 127.0.0.1|grep -v 172.16.1.1|awk '{print $2}'|cut -d : -f 2
java_name=$(ps -ef|grep weblogic|grep $pid|grep -v AdminServer)
name=echo ${java_name}|sed 's/^.*-Dweblogic.Name=//g'|awk '{print $1}'
#jvm記憶體監控
echo ##############################################
echo $sysdate
echo pid $pid
echo name $name
echo $addr
if [ "$pid" = "" ]
then
echo "the program is not exists."
exit 0
fi
heap=$(jmap -heap ${pid})
eden=echo ${heap}|sed 's/^.*Eden Space://g'|sed 's/From Space.*$//g'|awk '{print $13}'|sed 's/%.*$//g'|cut -b 1-6
from=echo ${heap}|sed 's/^.*From Space://g'|sed 's/To Space.*$//g'|awk '{print $13}'|sed 's/%.*$//g'|cut -b 1-6
tospc=echo ${heap}|sed 's/^.*To Space://g'|sed 's/tenured generation.*$//g'|awk '{print $13}'|sed 's/%.*$//g'|cut -b 1-6
oldge=echo ${heap}|sed 's/^.*PS Old Generation//g'|sed 's/Perm Generation.*$//g'|awk '{print $13}'|sed 's/%.*$//g'|cut -b 1-6
perm=echo ${heap}|sed 's/^.*PS Perm Generation//g'|awk '{print $13}'|sed 's/%.*$//g'|cut -b 1-6
echo "Eden Space: ${eden}%"
echo "From Space: ${from}%"
echo "To Space: ${tospc}%"
echo "Old Generation: ${oldge}%"
echo "Perm Generation: ${perm}%"
eden1=gawk -v x=$eden -v y=1000 'BEGIN{printf "%.0f\n",x*y}'
from1=gawk -v x=$from -v y=1000 'BEGIN{printf "%.0f\n",x*y}'
tospc1=gawk -v x=$tospc -v y=1000 'BEGIN{printf "%.0f\n",x*y}'
oldge1=gawk -v x=$oldge -v y=1000 'BEGIN{printf "%.0f\n",x*y}'
perm1=gawk -v x=$perm -v y=1000 'BEGIN{printf "%.0f\n",x*y}'
#取對應程序的jvm記憶體值
for name1 in $name
do
if [ ${eden1} -ge "99999" ]
then
jvm=$jvm+${name1}+":Eden Space:"+${eden}+"%超閥值 "
fi
if [ ${from1} -ge "99999" ]
then
jvm=$jvm+${name1}+":From Space:"+${from}+"%超閥值 "
fi
if [ ${tospc1} -ge "99999" ]
then
jvm=$jvm+${name1}+":To Space:"+${topspc}+"%超閥值 "
fi
if [ ${oldge1} -ge "99999" ]
then
jvm=$jvm+${name1}+":Old Generation:"+${oldge}+"%超閥值 "
fi
if [ ${perm1} -ge "99999" ]
then
jvm=$jvm+${name1}+":Perm Generation:"+${perm}+"%超閥值 "
fi
echo $jvm
done
#埠監控
if [ "$name" = "baobiao" ]
then
port='91400'
fi
if [ "$name" = "csr" ]
then
port='91200'
fi
if [ "$name" = "sso" ]
then
port=91500
fi
if [ "$name" = "gongdan" ]
then
port=91100
fi
if [ "$name" = "manager" ]
then
port=91300
fi
if [ "$name" = "cron" ]
then
port=91090
fi
net=netstat -an |grep $port|grep LISTEN|grep $addr
if [ "$net" = "" ]
then
p1=$p1+${port}+"埠異常"
fi
#echo $pid
#echo $port
#echo $name
done
#p2=$p1+"埠異常"
#url監控
http=curl -I -m 10 -o /dev/null -s -w %{http_code}"\n" http://www.callcent.kefu.com/sso/jsp/login.jsp
#echo $http
if [ "$http" != "200" ]
then
http1="統一登陸頁面http://www.xxxxxx.com/sso/jsp/login.jsp訪問異常"
fi
echo $p1
echo $addr
echo $http1
#傳送告警資訊
if [ -n "$p1" -o -n "$http1" -o -n "$jvm" ]
then
curl -d "action=SendMessage&msg=ip:${addr} $jvm ${p1} ${http1};&usernames=user1;user2" http://172.xx.xx.xxx:8090/TestService.ashx
fi
通過定時任務呼叫該指令碼(該指令碼每30秒執行一次):
* * * * * /monitor/script/monitor19.sh >> /monitor/log.txt
[root@loong /]#more /monitor/script/monitor19.sh
#!/bin/bash
export JAVA_PATH=/callcent/jdk1.6.0_25
export PATH=$PATH:$JAVA_PATH/bin:/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/mit/bin:/usr/lib/mit/sbin
step=30 #間隔的秒數,不能大於60,表示每半分鐘執行一次
for (( i = 0; i < 60; i=(i+step) )); do
/monitor/script/jvm-monitor.sh
sleep $step
done
exit 0
監控截圖:
Linux公社的RSS地址 : ofollow,noindex" target="_blank">https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2018-09/154438.htm