建德网站建设德品牌网,wordpress修改文章默认排序,wordpress工单系统.,一个网站需要多少钱问题描述#xff1a;公司项目太老了#xff0c;还是tomcat项目#xff0c;部署两台tomcat,做了nginx负载。最近发现每到上午10#xff0c;下午3点#xff0c;tomcat就宕机了#xff0c;死活找不到原因#xff0c;客户影响超期差#xff0c;实在让人头疼。
解决思路公司项目太老了还是tomcat项目部署两台tomcat,做了nginx负载。最近发现每到上午10下午3点tomcat就宕机了死活找不到原因客户影响超期差实在让人头疼。
解决思路写个脚本检测tomcat是否宕机如果宕机就重启每2分钟执行一次。注意为什么不是一分钟因为我们系统太大一分钟重启不了。再写另外一个脚本每秒执行一次检测tomcat是否宕机如果宕机就通过nginx切换到另外一台上,而不影响用户使用。
上代码哈哈哈~~~~
检测tomcat宕机自动重启脚本如下 分别是monitorTomcat8082.sh和monitorTomcat8085.sh由于两个代码类似提供一个就能说明问题了
#!/bin/sh# 获取tomcat进程ID /usr/local/tomcat
TomcatID$(ps -ef |grep tomcat8082 |grep -w tomcat8082|grep -v grep|awk {print $2}) # tomcat启动程序(这里注意tomcat实际安装的路径) StartTomcat/usr/local/web/tomcat8082/bin/startup.sh
ShutdownTomcat/usr/local/web/tomcat8082/bin/shutdown.sh# 定义要监控的页面地址 WebUrlhttp://localhost:8082# 日志输出TomcatMonitorLog/usr/local/web/tomcat8082/logs/TomcatMonitor.logMonitor(){ echo [info]开始监控tomcat...[$(date %F %H:%M:%S)] if [ $TomcatID ];then # 这里判断TOMCAT进程是否存在 echo [info]当前tomcat进程ID为:$TomcatID,继续检测页面... # 检测是否启动成功(成功的话页面会返回状态200) TomcatServiceCode$(curl -I -m 10 -o /dev/null -s -w %{http_code} $WebUrl) if [ $TomcatServiceCode -eq 200 ];then echo [info]页面返回码为$TomcatServiceCode,tomcat启动成功,测试页面正常...... else echo [error]tomcat页面出错,请注意......状态码为$TomcatServiceCode,错误日志已输出到$GetPageInfo echo [error]页面访问出错,开始重启tomcat $ShutdownTomcat sleep 3 rm -rf /usr/local/web/tomcat8082/bin/CATALINA_PID$StartTomcat fi else echo [error]tomcat进程不存在!tomcat开始自动重启... echo [info]$StartTomcat,请稍候...... #rm -rf $TomcatCache $StartTomcat fi echo ------------------------------ } Monitor$TomcatMonitorLog以上代码以上是 获取tomcat的进程号如果不存在就代表没启动启动。如果存在就访问页面试试如果没响应代表宕机了就重新启动。
检测tomcat宕机切换到备用tomcat脚本如下
分别是monitorNginx8082.sh和monitorNginx8085.sh由于两个代码类似提供一个就能说明问题了
#!/bin/bashNginxID$(cat /usr/local/nginx/conf/nginx.conf | grep liuchongyang8082| awk {print $2})# 定义要监控的页面地址 WebUrlhttp://localhost:8082# 日志输出NginxMonitorLog/usr/local/nginx/logs/NginxMonitorLog8082.logMonitor(){ echo [info]开始监控tomcat8082...[$(date %F %H:%M:%S)] # 检测是否启动成功(成功的话页面会返回状态200) TomcatServiceCode$(curl -I -m 10 -o /dev/null -s -w %{http_code} $WebUrl) if [ $TomcatServiceCode -eq 200 ];then echo [info]页面返回码为$TomcatServiceCode,tomcat8082启动成功,测试页面正常...... else if [ $NginxID liuchongyang8085 ];thenecho [error] 当前nginx配置文件已经是8085无需切换elseecho [error]tomcat8082页面出错,请注意......状态码为$TomcatServiceCode,错误日志已输出到$GetPageInfo echo [error]页面访问出错,开始切换备用程序 8085 cp /usr/local/nginx/conf/nginx8085.conf /usr/local/nginx/conf/nginx.conf/usr/local/nginx/sbin/nginx -s reloadfifi echo ------------------------------ } step1 #间隔的秒数不能大于60
for (( i 0; i 60; i(istep) )); do Monitor$NginxMonitorLogsleep $step
done
exit 0
以上代码以上是 访问页面试试如果没响应代表宕机了就切换到备用tomcat 。
至于 定时任务我使用的是centos自带的crontab服务。 第一个脚本每2分钟执行一次第二个脚本每秒执行一次。 crontab只能每分钟执行一次我是通过第二个脚本中用for循环和sleep做到的。
类似
*/2 * * * * sh /usr/local/web/monitorTomcat8082.sh
*/2 * * * * sh /usr/local/web/monitorTomcat8085.sh*/1 * * * * bash /usr/local/web/monitorNginx8082.sh
*/1 * * * * bash /usr/local/web/monitorNginx8085.sh在Tomcat宕机了monitorTomcat.sh脚本去调用bin/startup.sh 命令的时候出现以下的错误 Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program 解决办法 在tomcat、bin目录下的 setclasspath.sh 文件头部加上以下两个参数目的就是指定其JDK环境
export JAVA_HOME/home/boss_indb/software/jdk1.8.0_152
export JRE_HOME${JAVA_HOME}/jre