背景:手头有个预生产环境,某个应用的server经常内存溢出;该环境没有部署监控系统,所以经常接到现场支持的反馈电话说系统无法使用,属于被动式的监控;
给现场支持和运维人员都增加工作负担;后来我就想写一个脚本,检测内存溢出后将该sever重启(集群),试过很多高大上的方法没成功,最后用本文这个脚本实现了。
AutoRestart.sh
#!/bin/bash
#Coding by Hailang
source /weblogic/Oracle/Middleware/wlserver_10.3/server/bin/setWLSEnv.sh >/dev/null 2>&1
echo `date`
adminServer='t3://ipaddress:9001'
ysc_svr001='t3://ipaddress:8001'
ysc_svr002='t3://ipaddress:8002'
RTT=`java weblogic.Admin -url $ysc_svr001 -username weblogic -password weblogic123 PING|grep RTT`
if [ ! "$RTT" ];then
echo "Over!"
ps -ef|grep ysc_svr001|grep -v grep|awk '{print $2}'|xargs kill -9
sleep 3
pid=`ps -ef|grep ysc_svr001|grep -v grep|awk '{print $2}'`
if [ "$pid" ];then
echo "Starting by NodeManager!"
else
java weblogic.Admin -url $adminServer -username weblogic -password weblogic123 START ysc_svr001
fi
else
echo "ysc_svr001":$RTT
fi
RTT=`java weblogic.Admin -url $ysc_svr002 -username weblogic -password weblogic123 PING|grep RTT`
if [ ! "$RTT" ];then
echo "Over!"
ps -ef|grep ysc_svr002|grep -v grep|awk '{print $2}'|xargs kill -9
sleep 3
pid=`ps -ef|grep ysc_svr002|grep -v grep|awk '{print $2}'`
if [ "$pid" ];then
echo "Starting by NodeManager!"
else
java weblogic.Admin -url $adminServer -username weblogic -password weblogic123 START ysc_svr002
fi
else
echo "ysc_svr002":$RTT
fi
设置Linux定时任务为:
crontab -l
*/15 * * * * /weblogic/Oracle/Middleware/wlserver_10.3/server/bin/AutoRestart.sh >> /weblogic/Oracle/Middleware/wlserver_10.3/server/bin/autoRestart.log 2>&1
autoRestart.log如下:
Thu Apr 30 15:30:01 CST 2015
ysc_svr001: RTT = ~3 milliseconds, or ~3 milliseconds/packet
Over!
Starting by NodeManager!
Thu Apr 30 15:45:01 CST 2015
ysc_svr001: RTT = ~4 milliseconds, or ~4 milliseconds/packet
ysc_svr002: RTT = ~32 milliseconds, or ~32 milliseconds/packet
在server内存溢出的时候,我及时地做了很多尝试,最后发现内存溢出的时候weblogic.Admin是ping不通的,于是就抓住这个状态写脚本了。
另外:刚开始写脚本的时候关闭内存溢出的server是用weblogic.Admin的方式(官方不推荐使用weblogic.Admin)
java weblogic.Admin -url t3://ipaddress:8001 -username weblogic -password weblogic123 FORCESHUTDOWN ysc_svr001
后来看日志发现这样的方式并不靠谱,经常会报错:
Failed to connect to t3://ipaddress:8001: Bootstrap to yscap01/ipaddress:8001 failed. It is likely that the remote side declared peer gone on this JVM
没辙啦,只能用残忍的kill方式了......
看完这个脚本的朋友很可能会嗤之以鼻,因为脚本太傻瓜式了,循环都不写,假如有100个server呢;不过还好现场支持再也没有打电话说系统挂了,因为集群环境下该脚本能把内存溢出的server及时重启了,这样对大伙很好,不用等到2个server全部挂系统都用不了的才打电话告诉我。
抛砖引玉:还有什么方式能把已经内存溢出的server重启?最好是能做到像控制台那样的“当工作完成时”关闭。