shell脚本监控SpringBoot服务健康状态并重启
创始人
2024-04-07 23:50:06
0

问题

  • 综合客户反馈的现场情况,服务前一天可以使用正常,第二天早晨发现报错; 初步怀疑是晚上什么操作导致的,大概是定时任务
  • 查看服务日志,综合几天日志,发现每晚都会执行一个日志清除的定时任务scheduledtask.CleanLogJob
{"log":"\u001b[2m2022-10-30 00:00:00.001\u001b[0;39m \u001b[32m INFO\u001b[0;39m \u001b[35m1\u001b[0;39m \u001b[2m---\u001b[0;39m \u001b[2m[ne-scheduling-1]\u001b[0;39m \u001b[36mc.newatc.api.scheduledtask.CleanLogJob  \u001b[0;39m \u001b[2m:\u001b[0;39m ----开启定时清理日志文件----2022-10-29T16:00:00.001343Z\n","stream":"stdout","time":"2022-10-29T16:00:00.002200283Z"}
{"log":"\n","stream":"stderr","time":"2022-10-29T16:00:32.158196254Z"}
{"log":"Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread \"Hikari housekeeper\"\n","stream":"stderr","time":"2022-10-29T16:00:32.158216755Z"}
{"log":"\u001b[2m2022-10-30 00:01:22.799\u001b[0;39m \u001b[31mERROR\u001b[0;39m \u001b[35m1\u001b[0;39m \u001b[2m---\u001b[0;39m \u001b[2m[ne-scheduling-1]\u001b[0;39m \u001b[36mo.s.s.s.TaskUtils$LoggingErrorHandler   \u001b[0;39m \u001b[2m:\u001b[0;39m Unexpected error occurred in scheduled task\n","stream":"stdout","time":"2022-10-29T16:01:22.800399506Z"}
{"log":"\n","stream":"stdout","time":"2022-10-29T16:01:22.800414807Z"}
{"log":"java.lang.OutOfMemoryError: Java heap space\n","stream":"stdout","time":"2022-10-29T16:01:22.800417418Z"}
{"log":"\n","stream":"stdout","time":"2022-10-29T16:01:22.800419609Z"}
  • 定时任代码是先根据当前日期查询7天前的所有数据,再全部删除。当某一天数据量特别大,无法全部加载到内存时,就会内存溢出,程序就会假死
/*** 每天零点定时清理日志*/@Scheduled(cron = "0 0 0 * * ?")public void deleteLog(){log.info("----开启定时清理日志文件----{}", Instant.now());try{SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Calendar c = Calendar.getInstance();//过去七天c.setTime(new Date());c.add(Calendar.DATE, -7);String day = format.format(c.getTime());List opLogList = findOpLogByDayNum(day);opLogRepository.deleteAll(opLogList);List signalAlarmList = findSignalAlarmByDayNum(day);signalAlarmRepository.deleteAll(signalAlarmList);}catch (Exception e){log.error("deleteLog error..", e);}}
  • 定时任务执行后,内存溢出java.lang.OutOfMemoryError: Java heap space。查看服务的jvm配置,只分配了 512M 内存,对于大量数据读入内存,确实不够用
  • 查看代码提交记录,综合更新部署时间和问题出现时间,基本确定是此问题
  • 让运维人员协助查询了数据库,发现每天新增10万条信号机报警日志,仍有13天(100多万条)的数据存在,确实是删除日志时内存溢出失败

分析

  • 数据量问题确实是到客户现场,有实际这么多设备和用户才暴露出来的,公司测试无法进行此种场景的压力测试,只能把这款产品的第一个用户作为小白鼠了
  • SpringBoot服务因异常宕机或假死时,不再提供服务,会从注册中心掉线,并且整个应用就不可用了
  • 如果只是某些菜单功能不可用,对于客户来说还可以接受,毕竟试运行阶段,有点小问题客户也能理解
  • 如果是整个服务宕机,界面打不开,客户就会对系统的稳定性产生怀疑,印象会不太好
  • 或者说,某些导致宕机的问题,如果及时处理了,客户就暂时发现不了这个问题,就能减少对客户的负面印象

处理

  • 针对于此,写了个shell脚本,监控SpringBoot服务暴露的端点,服务不可用时,进行重启操作
  • 为了防止网络波动造成的影响,重试三次请求,都得不到健康的结果,才认为不可用
  • 具体脚本如下:
#!/bin/bash# 检查服务是否可用,判断服务状态
function checkHealth() {currTime=`date +"%Y-%m-%d %H:%M:%S"`echo "$currTime $@"; # 以列表的方式一次性打印所有的参数ConsulResult=$(curl -s --connect-timeout 500 --max-time 2  http://$1/actuator/health )target="UP"local health=1if [[ $ConsulResult =~ $target ]]thenecho "$2结果健康";elsesleep 1s;ConsulResult=$(curl -s --connect-timeout 500 --max-time 2  http://$1/actuator/health )if [[ $ConsulResult =~ $target ]]thenecho "$2结果健康";elsesleep 1s;ConsulResult=$(curl -s --connect-timeout 500 --max-time 2  http://$1/actuator/health )if [[ $ConsulResult =~ $target ]]thenecho "$2结果健康";elsehealth=0;echo "$2 结果不健康";fififireturn $health;
}# 检查服务健康状态,并处理异常
function dealCheckResult() {ipport=$1name=$2echo "start $name ======================="checkHealth $ipport $namehealth=$?if [[ $health -eq 1 ]]thenecho "$name 检查完毕,无问题!"elseecho "重启 $name 预计2分钟"# 重启服务docker stop $namesleep 5sdocker start $namesleep 120s# 重新检查一次是否启动成功,不成功则再休眠60scheckHealth $ipport $namehealth=$?currTime=`date +"%Y-%m-%d %H:%M:%S"`if [[ $health -eq 1 ]];thenecho "$currTime $name 服务已重启完成"elseecho "$currTime $name 服务尚未重启完成,再休眠60s等待"sleep 60sfifiecho "end $name 所有处理完毕==========="
}# 获取系统启动时间
uptime=$(cat /proc/uptime)
echo "uptime: $uptime"
uptimeArr=(${uptime//./ })
startTime=${uptimeArr[0]}
echo $startTime
a=`expr $startTime + 1`
b=1800
# 系统启动30分钟内不执行
if [[ "$a" -lt "$b" ]];
thenecho "系统启动30分钟内不执行"exit
fi
echo "启动时间为$startTime秒,正常执行脚本"echo "先关闭定时任务"
/sbin/service crond stopipport1=172.16.1.122:8181
name1=datacenter
dealCheckResult $ipport1 $name1ipport2=172.16.1.122:8282
name2=unit
dealCheckResult $ipport2 $name2ipport3=172.16.1.122:8383
name3=core
dealCheckResult $ipport3 $name3echo "重新启动定时任务"
/sbin/service crond start

相关内容

热门资讯

三门峡市2025年度市直机关公... 转自:三门峡发布三门峡市2025年度市直机关公开遴选拟任职人员公示公告根据2025年度三门峡市市直机...
进一步加强环境资源审判裁判规则...   为进一步加强环境资源审判裁判规则指引,最高人民法院近日公开发布第46批共5件生态环境保护专题指导...
纪念爱因斯坦广义相对论公开首讲... 来源:新华社 新华社柏林6月15日电(记者黄燕)当地时间14日下午至15日凌晨,柏林天文馆基金会在位...
“微专业”“小而精” 探索人才... 转自:中国发展网中国发展改革报社记者 | 荆文娜过去,人们常会问刚考上大学的学生,“学的什么专业?”...
行业大咖共议电影未来:需要重新... 上证报中国证券网讯(记者杨翔菲王彭)在短视频冲击、观众口味升级、行业成本攀升的多重挑战下,中国电影产...
国家统计局分析5月份国内消费市... 转自:北京日报客户端6月16日上午,国新办举行新闻发布会,介绍2025年5月份国民经济运行情况。记者...
最高检去年核准追诉低龄未成年人... 界面新闻记者 | 翟瑞民2025年6月16日,最高人民检察院发布《未成年人检察工作白皮书(2024)...
武威:构建全方位水安全网   西北角·中国甘肃网记者 张振国  为全面提升水环境自动监测能力,确保国家地表水水质自动站稳定高效...
最新:伊朗对以色列发动第八轮导... 据伊朗塔斯尼姆通讯社16日报道,伊朗当天凌晨对以色列发动了新一轮导弹袭击。这是伊朗伊斯兰革命卫队“真...
东软集团等成立数智康养产业新公... 人民财讯6月16日电,企查查APP显示,近日,大连数智康养产业有限公司成立,法定代表人为王星辉,经营...
国家统计局付凌晖:推动城市更新... 观点网讯:6月16日,国家统计局新闻发言人付凌晖在国新办新闻发布会上表示,下阶段将推动城市更新和危旧...
【女装】行业市场规模:2024... 转自:前瞻产业研究院行业主要上市公司:江南布衣(3306.HK)、歌力思(603808)、太平鸟(6...
2025年廊坊经洽会丨展商、好... 转自:廊坊发布编辑:董昕
正明生物:广州化妆品代加工的领... 在广州化妆品代加工这片竞争激烈的商业蓝海中,佛山正明生物科技有限公司宛如一艘稳健前行的巨轮,凭借卓越...
国家统计局:我国外贸发展综合优... 人民财讯6月16日电,国家统计局新闻发言人、国民经济综合统计司司长付凌晖在国新办新闻发布会上表示,5...
创新药BD交易再迎新进展,科创... 截至2025年6月16日 11:13,上证科创板生物医药指数下跌0.83%。成分股方面涨跌互现,悦康...
热闻|雷军“官宣”!小米YU7... 转自:大众报业·齐鲁壹点6月16日信息,雷军在微博发文表示,小米YU7将于6月底发布。还有很多重磅新...
伊朗对以色列发动第八轮导弹袭击 新华社德黑兰6月16日电(记者陈霄 沙达提)据伊朗塔斯尼姆通讯社16日报道,伊朗当天凌晨对以色列发动...
邦泽创科IPO:员工专科及以下... Hehson财经上市公司研究院|财报鹰眼预警广东邦泽创科电器股份有限公司(以下简称“邦泽创科”)拟计...
华康洁净:董秘回应股价不涨及市... 投资者提问:作为该股的股东,想了解下公司股价近来一直不涨的原因,所属板块已经涨了近20%了,但该股一...