这个脚本的主要功能是监控Tomcat服务的运行状态,它会:
- 检查Tomcat进程是否运行
- 检查Tomcat日志文件是否在最近2小时内更新过
- 如果Tomcat未运行或日志超过2小时未更新,会自动重启Tomcat服务
- 所有操作都会记录到指定的日志文件中
脚本通过比较时间戳来判断日志是否更新,使用Unix时间戳(秒数)进行计算,确保判断准确。
#!/bin/bash
# 定义环境变量
PATH=/opt/java/jdk1.8.0_91/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
export PATH # 设置系统PATH环境变量
export LANG=zh_CN.UTF-8 # 设置系统语言为中文UTF-8
#export PATH=$PATH:$JAVA_HOME/bin # 注释掉的JAVA_HOME路径设置
# 获取当前日期和时间
curdate=`date +%Y-%m-%d` # 当前日期,格式:YYYY-MM-DD
curtime=`date +%Y-%m-%d' '%H:%M:%S` # 当前完整时间,格式:YYYY-MM-DD HH:MM:SS
#logcurtime= `stat catalina.2019-10-11.out | awk -F " " 'NR==6 {print $2" "$3}' | awk -F "." '{print $1}'` # 注释掉的旧代码
curStamp=`date -d "$curtime" +%s` # 将当前时间转换为Unix时间戳(秒数)
# 定义日志文件路径,使用当前日期命名
logsdir="/data/logs/tomcat-test/catalina.$curdate.out"
# 获取日志文件最后修改时间,并格式化为标准时间格式
logcurtime=`stat $logsdir | awk -F " " 'NR==6 {print $2" "$3}' | awk -F "." '{print $1}'`
logStamp=`date -d "$logcurtime" +%s` # 将日志修改时间转换为Unix时间戳
jklogdir="/opt/wasu/jkshell/jklog.log" # 监控脚本自身的日志文件路径
exdir="/opt/tomcat-test/bin" # Tomcat的bin目录路径
# 定义监控函数
Monitor()
{
# 获取Tomcat进程ID
psid=`ps auwx | grep "tomcat-test/bin/bootstrap" | grep -v "grep" | awk '{print $2}'`
# 记录监控信息到日志文件
echo "############## current date is $curtime ###################" >>$jklogdir
echo "被监控日志: $logsdir" >>$jklogdir
echo "############## 日志更新时间 is $logcurtime ###################" >>$jklogdir
echo "tomcat id : $psid" >>$jklogdir
echo "当前时间戳: $curStamp" >>$jklogdir
echo "日志更新时间戳:$logStamp" >>$jklogdir
# 计算日志时间+2小时(7200秒)的时间戳
#timeval=`expr $logStamp + 10` # 注释掉的测试代码(只加10秒)
timeval=`expr $logStamp + 7200` # 实际使用的2小时阈值
echo "日志时间+7200: $timeval" >> $jklogdir
# 检查Tomcat进程是否存在
if [ "$psid" = "" ]; then
{
echo " tomcat-test pid is not alive" >>$jklogdir
#mv nohup.out nohup.out_$curtime # 注释掉的备份命令
# 如果Tomcat未运行,则启动它
cd $exdir
./startup.sh # 执行启动脚本
sleep 5 # 等待5秒
# 再次获取进程ID并记录
psid=`ps auwx | grep "tomcat-test/bin/bootstrap" | grep -v "grep" | awk '{print $2}'`
echo "tomcat id $psid" >>$jklogdir
echo "now service start " >>$jklogdir
}
else
# 如果Tomcat正在运行,检查日志文件是否存在或是否超过2小时未更新
if [ ! -f $logsdir -o $curStamp -gt $timeval ]; then
{
echo "日志超过2小时没有更新;" >>$jklogdir
kill -9 $psid # 强制杀死Tomcat进程
echo "KILL $psid;" >>$jklogdir
echo "now service stop success" >>$jklogdir
sleep 10 # 等待10秒
# 重新启动Tomcat
#mv nohup.out nohup.out_$curtime # 注释掉的备份命令
cd $exdir
./startup.sh
sleep 5 # 等待5秒
# 记录新进程ID
psid=`ps auwx | grep "tomcat-test/bin/bootstrap" | grep -v "grep" | awk '{print $2}'`
echo "new tomcat id $psid" >>$jklogdir
echo "now service start success" >>$jklogdir
}
else
# 如果一切正常,记录"do nothing"
echo "执行结果:do noting" >>$jklogdir
fi
fi
}
# 执行监控函数
Monitor;
exit;