业务场景:
为了防止服务器tomcat异常造成的web项目访问异常。我们开发了一个shell脚本,用来监听,重启tomcat,同时发送短信通知。
短信通知的逻辑:是tcp传输json调用短信通知接口实现。
服务器地址:xx.xxx.xx.xx
脚本存放地址: /usr/local/tomcat/bin
restartTomcat.sh
###########################################
# author wujj
# date 2020/11/17
# update
# Automatic detection and restart tomcat
# 监听检测,重启tomcat,并发送短信通知
# name restartTomcat.sh
############################################
while :
do
echo ========================================
date=$(date -d "today" +"%Y%m%d %H:%M:%S")
cd /usr/local/tomcat/bin/script
rm -f index.html
wget -T 10 -t 3 -q http://xx.xx.xx.130:8080
if [ -e index.html ]; then
echo "tomcat checked,it is opened."
else
#curl https://sc.ftqq.com/SCU127446Tb535bddadf3dddfebd0e8a9ba58c97d85fb38d0c5c40e.send?text=主人服务器又挂掉啦~
#echo "xx.xxx.xx.130 的tomcat挂掉了."
exec 9>/dev/tcp/xx.xxx.xxx.16/42020
#echo "$date">& 9
#echo "{"SysModule":"Test","MonitorData": [{"Content":"xx.xxx.xx.130,该服务器的tomca异常关闭","Mobiles":["150xxxx8134"]}]}">& 9
echo "{ \"SysModule\":\"valueAdd\",\"MonitorData\" :[{\"Content\":\"xx.xxx.xx.130,该服务器的tomca异常关闭\", \"Mobiles\" : [\"150xxxx8134\"]}] }">& 9
exec 9>&-
echo "restart tomcat."
# /usr/local/tomcat/bin/shutdown.sh
#sleep 10
#kill -9 `ps aux|grep "/usr/local/tomcat"|grep -v grep|awk '{print $2}'`
#sleep 5
/usr/local/tomcat/bin/startup.sh
fi
sleep 20s
done
思路
1.这里没有直接监控tomcat端口,而是通过wget传输文件来测试,因为wget是可以走http协议的,正好可以经过tomcat来测试web服务是否有效,很巧妙的应用!同理也可做其他服务的监控。
2.确定tomcat异常后,会tcp连接到某个服务器地址端口42020,并发送json过去。
3.关于42020端口,是我们发送短信通知的接口的端口。调用这个端口会调用短信通知逻辑。
4.脚本里做了while do循环,每20s会执行一次。
步骤:
1.把这个shell文件放到tomcat的bin目录下,和tomcat的startup.sh脚本放一起。
2.在bin下面mkdir一个script文件夹,用来放下载的index.html.
3.关闭tomcat, ./shutdown.sh ,然后执行这个脚本看看输出。
4.如果脚本不能执行,记得加上权限chmod 755 xxx.sh。
生产环境:
如果要在生产环境里加上脚本,记得额外加上一个启动脚本和停止脚本。
startRestartTomcat.sh
#!/bin/sh
nohup ./restartTomcat.sh &
这个命令表示后台执行,来保证restartTomcat的进程的存活。
stopRestartTomcat.sh
#!/bin/sh
STARTSCRIPT="./restartTomcat.sh"
PROGRAM="./restartTomcat"
LOGPATH="/usr/local/tomcat/logs/"
LOGNAME="status.log"
DATE=$(date -d "today" +"%Y%m%d")
TIME=$(date -d "today" +"%Y%m%d %H:%M:%S")
echo "__________start__________stop restartTomcat.sh_________" $TIME >> $LOGPATH$DATE$LOGNAME
kill -9 `ps -ef|grep $STARTSCRIPT | grep -v grep | awk '{print $2}'` >> $LOGPATH$DATE$LOGNAME 2>&1
kill -9 `ps -ef|grep $PROGRAM | grep -v grep | awk '{print $2}'` >> $LOGPATH$DATE$LOGNAME 2>&1
echo "____________________end_______________________" >> $LOGPATH$DATE$LOGNAME
echo "stop restartTomcat.sh!"
这里就是杀死restartTomcat的进程了。
你自己用的时候,记得改成自己的路径。