1.简单粗暴点将代码粘贴出来,但是在公司有的项目名该隐藏的就隐藏了,不懂可以看注释或者询问博主。
#基本这种情况,我写了个监控shell脚本的解决方案,不管以上出现那种情况,都自动恢复Nginx、mysql、tomcat、redis的服务.该脚本在生产环境上运行正常
#!/bin/bash
#
# filename: startBatch.sh
# 功能:监控 nginx、mysql tomcat、redis的服务是否正常 如果不正常就先结束掉进程然后重新启动项目
# 运行: ./startBatch.sh &
# 如果出现报错
# 或者前面增加 chmod +x ./startBatch.sh #使脚本具有执行权限
#
# mysql 监控的IP和端口
V_MYSQL_CGI_PORT=""
# redis 监控IP与端口
V_REDIS_CGI_PORT=""
# apache监控IP与端口
V_APACHE_CGI_PORT=""
# tomcat监控IP与端口
V_TOMCAT_CGI_PORT=""
# spring boot服务 监控IP与端口
V_1_CGI_PORT=""
V_2_CGI_PORT=""
# nginx重启的脚本
V_NGINX="/usr/local/nginx/sbin/restart.sh"
# mysql重启的脚本
V_MYSQL=""
# apache重启的脚本
V_APACHE=""
# tomcat重启的脚本
V_TOCMAT=""
# redis重启动脚本 注意redis搭建是主从、哨兵模式
V_REDIS_SERVER_79_CONF=""
V_REDIS_SERVER_80_CONF=""
V_REDIS_SENTINEL_279_Sentinel=""
V_REDIS_SENTINEL_280_Sentinel=""
# spring boot重启的脚本 服务
V_1=""
# spring boot重启的脚本 服务
V_2=""
# 微服务启动文件的项目名
V_1_START=""
V_2_START=""
# 日志文件 打印日志文件存放路径
V_LOG="/tmp/startBatch.log"
# 函数定义:重启nginx
function restart_nginx(){
echo "----- `date` -----" >> $V_LOG
echo "------------------" >> $V_LOG
echo "`ps aux |grep 'nginx'`" >> $V_LOG
echo "------------------" >> $V_LOG
echo "`ps aux |grep 'mysql'`" >> $V_LOG
echo "------------------" >> $V_LOG
echo "`ps aux |grep 'redis'`" >> $V_LOG
echo "------------------" >> $V_LOG
echo "`ps aux |grep 'tomcat'`" >> $V_LOG
echo "------------------" >> $V_LOG
echo "`ps aux |grep '1'`" >> $V_LOG # 不知道是大写还是小写
echo "------------------" >> $V_LOG
echo "`ps aux |grep 'java'`" >> $V_LOG
echo "------------------" >> $V_LOG
echo "`ps aux |grep '2'`" >> $V_LOG # 不知道是大写还是小写
echo "------------------" >> $V_LOG
echo "`netstat -nlpt | grep '1'`" >> $V_LOG #查看端口是否被占用
echo "------------------" >> $V_LOG
echo "`netstat -nlpt | grep '2'`" >> $V_LOG #查看端口是否被占用
echo "------------------" >> $V_LOG
$V_NGINX >> $V_LOG #将nginx启动日志放入shell的批处理命令日志目录上
}
# 循环执行,不采用 crontab ,国为 crontab 最小单位是分钟,时间太长了
while :
do
# 1:先检测 nginx 主进程是否存在
V_NGINX_NUM=`ps axu |grep 'nginx' |grep -v 'grep' |wc -l`
if [ $V_NGINX_NUM -lt 1 ];then
restart_nginx #重新启动nginx命令
continue
fi
# 2:再检查mysql是否有进程存在
V_MYSQL_CGI_NUM=`ps axu |grep 'mysql' |grep -v 'grep' |wc -l`
if [ $V_MYSQL_CGI_NUM -lt 1 ];then
# 重新启动mysql命令
service mysqld restart # 1.使用 service 启动
#/etc/inint.d/mysqld restart # 2.使用 mysqld 脚本启动
continue
fi
# 3:再检查tomcat是否有进程存在
V_TOMCAT_CGI_NUM=`ps axu |grep 'tomcat' |grep -v 'grep' |wc -l`
if [ $V_TOMCAT_CGI_NUM -lt 1 ];then
#cd /usr/local/tomcat/bin 进入tomcat启动目录
./startup.sh #重新启动tomcat命令
continue
fi
# 4:再检查redis是否有进程存在
V_REDIS_CGI_NUM=`ps axu |grep 'redis' |grep -v 'grep' |wc -l`
if [ $V_REDIS_CGI_NUM -lt 1 ];then
redis-server ./redis_1.conf #重新启动redis主从模式命令
redis-server ./redis_2.conf #重新启动redis主从模式命令
redis-sentinel ./sentinel_1.conf #重新启动redis哨兵模式命令
redis-sentinel ./sentinel_2.conf #重新启动redis哨兵模式命令
continue
fi
# 5.1再检查1是否有进程存在
V_1_CGI_NUM=`ps axu |grep '1' |grep -v 'grep' |wc -l`
if [ $V_1_CGI_NUM -lt 1 ];then
#cd 到spring boot得服务目录 通过shell命令 举例子:cd /home/jiulong/mstar/TVOS_Release_V1.0.6/jb_4.2/
java -jar $V_1_START #重新启动1命令
continue
fi
# 5.1:再判断1端口是否正常
for PORT in $V_1_CGI_PORT
do
V_NUM_1=`eval "netstat -nlpt | grep '${PORT}' | wc -l"`
if [ $V_NUM_1 -lt 1 ];then
# 如果启动报错将这行命令进行启动 先杀死进程 kill -9 $V_1_CGI_NUM
#cd 到spring boot得服务目录 通过shell命令 举例子:cd /home/jiulong/mstar/TVOS_Release_V1.0.6/jb_4.2/
java -jar $V_1_START #重新启动1命令
#java -jar 1.jar #重新启动1命令
continue
fi
done
# 5.2:再检查2是否有进程存在
V_2_CGI_NUM=`ps axu |grep '2' |grep -v 'grep' |wc -l`
if [ $V_2_CGI_NUM -lt 1 ];then
#cd 到spring boot得服务目录 通过shell命令 举例子:cd /home/jiulong/mstar/TVOS_Release_V1.0.6/jb_4.2/
#重新启动2主从模式命令
continue
fi
# 5.2:再判断2端口是否正常
for PORT in $V_2_CGI_PORT
do
V_NUM_2=`eval "netstat -nlpt | grep '${PORT}' | wc -l"`
if [ $V_NUM_2 -lt 1 ];then
# 如果启动报错将这行命令进行启动 先杀死进程 kill -9 $V_NUM_2
#cd 到spring boot得服务目录 通过shell命令 举例子:cd /home/jiulong/mstar/TVOS_Release_V1.0.6/jb_4.2/
java -jar $V_2 #重新启动2主从模式命令
#java -jar 2.jar #重新启动2命令
continue
fi
done
# 休眠
sleep 5
done
解决其它问题:https://blog.csdn.net/qq_32447301/article/details/81109575