这里是普通文章模块栏目内容页
定时检测Tomcat服务器是否奔溃,奔溃后重启

编写Tomcat服务器监控脚本,定时检测Tomcat服务器是否奔溃,奔溃后重启。

每次Tomcat服务器莫名挂掉就想打人,只能像孩子一样去Git Bash重启。今天去某歌查了一下,Tomcat老是挂掉是啥原因,忽然看到一篇关于“Ubuntu Tomcat服务器设置自动重启,定时检查崩溃后重启”的文章,所以参照文章码了一份自己的shell脚本。希望能帮助有一样困境的人。在服务器任意位置创建xxx.sh,脚本内容可以在windows上编写,切记不要直接upload在windows上写的shell脚本,不然可能会报错xxxxxx[then]。
执行 sudo chomd 777 xxx.sh
vim xxx.sh
检查shell脚本是否有语法错误  sudo sh -n xxx.sh
转到xxx.sh所在目录,并以管理员权限运行脚本文件 。sudo sh  xxx.sh
创建定时任务执行脚本,执行命令 sudo crontab  -e 编辑root用户下的定时任务文件。首次使用会有编辑器模式选择  vim 选3 
在文件中写入:  */10 * * * * /usr/local/xxx.sh间隔10分钟执行一次脚本

minute hour day month dayofweek command

如:42 4 1 * * root run-parts /etc/cron.monthly 

minute — 分钟,从 0 到 59 之间的任何整数 
hour — 小时,从 0 到 23 之间的任何整数 
day — 日期,从 1 到 31 之间的任何整数(如果指定了月份,必须是该月份的有效日期) 
month — 月份,从 1 到 12 之间的任何整数(或使用月份的英文简写如 jan、feb 等等) 
dayofweek — 星期,从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日(或使用星期的英文简写如 sun、mon 等等) 
command — 要执行的命令(命令可以是ls /proc >> /tmp/proc 之类的命令,也可以是执行你自行编写的脚本的命令。) 
在以上任何值中,星号(*)可以用来代表所有有效的值。譬如,月份值中的星号意味着在满足其它制约条件后每月都执行该命令。 
整数间的短线(-)指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4。 
用逗号(,)隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的整数。 
正斜线(/)可以用来指定间隔频率。在范围后加上 /2 意味着在范围内可以跳过 2。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月运行一次任务。

xxx.sh内容如下:

#!/bin/sh
#定义环境变量(要改成自己的jdk相关地址)在编辑器输入 echo $path就可得到下面PATH
PATH=/usr/local/jdk/jdk1.8.0_161/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

#JAVA_HOME就是JDK安装路径
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_161
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
# 获取tomcat进程ID,其中“tomcatDir”要改成自己的tomcat安装目录的文件夹名称
TomcatID=$(ps -ef |grep tomcat |grep -w 'tomcat8'|grep -v 'grep'|awk '{print $2}')
# tomcat启动程序(这里注意要改成自己tomcat实际安装的路径)
StartTomcat=/usr/local/tomcat8/bin/startup.sh
TomcatCache=/usr/local/tomcat8/work
# 自己定义要监控的页面地址,
WebUrl=http://www.baidu.com
# 日志输出 (自己定义地址,用于输出监控日志和监控报错日志)
TomcatMonitorLog=/usr/local/tomcat8/logs/TomcatMonitor.log
GetPageInfo=/usr/local/tomcat8/logs/PageInfo.log
go(){undefined
echo "[info]开始监控tomcat...[$(date +'%F %H:%M:%S')]"
#判断tomcat进程是否存在
if [ $TomcatID ]
then
    echo "[info]当前tomcat进程ID为:$TomcatID,继续检测页面..."
    # 检测是否启动成功(成功的话页面会返回状态"200")  
    TomcatServiceCode=$(curl -s -o $GetPageInfo -m 10 --connect-timeout 10 $WebUrl -w %{http_code})
    if [ $TomcatServiceCode -eq 200 ]
    then
        echo "[info]页面返回码为$TomcatServiceCode,tomcat启动成功,测试页面正常......"
    else
        echo "[error]tomcat页面出错,请注意......状态码为$TomcatServiceCode,错误日志已输出到$GetPageInfo"
        echo "[error]页面访问出错,开始重启tomcat"
        kill -9 $TomcatID  # 杀掉原tomcat进程  
        sleep 3
        rm -rf $TomcatCache # 清理tomcat缓存  
        $StartTomcat  
    fi
else
    echo "[error]tomcat进程不存在!tomcat开始自动重启..."
    echo "[info]$StartTomcat,请稍候......"
    #rm -rf $TomcatCache
    $StartTomcat
fi
echo "------------------------------"
}
go>>$TomcatMonitorLog