Linux服务器自动监听Web应用接口,未响应自动重启JAVA应用脚本

近期部署了一个多台负载的应用在linux服务器,但总有其中的某台服务器应用会出现假死,导致dubbo请求出现RPC调用失败。当然主要问题肯定是程序上的某些问题导致的。但无法快速定位排查,所以弄个脚本自动监听接口,当出现未响应,自动重启应用来达到应急快速恢复生产环境的目的。

需要前提条件:
1、服务器直接需要设置免密访问参考
Linux复制程序包到其他服务器、第一点
2、java的启动脚本需要支持重启功能,即先关闭当前应用,再启动java,防止端口占用,参考
Linux复制程序包到其他服务器、第三点

自动监听的脚本代码如下:

#!/bin/bash#是否启用此脚本,用于更新程序的时候,先关闭,更新完成后再开启,0 否 1 是
ENABLE=1# 检查 enable 的值,如果是0 就先不执行此脚本
if [ "$ENABLE" -eq 0 ]; thenecho "脚本已禁用,停止执行。"exit 1  # 退出脚本,返回非零状态码表示异常退出
fi# 定义接口URL,这里有五台服务器做负载,所以重复了5次
API_URL1="http://192.168.0.14:8701/api/a"
API_URL2="http://192.168.0.15:8701/api/a"
API_URL3="http://192.168.0.16:8701/api/a"
API_URL4="http://192.168.0.20:8701/api/a"
API_URL5="http://192.168.0.21:8701/api/a"
# 定义判断的超时时间(秒),当响应时间超过5秒自动重启应用
TIMEOUT=5
# 定义请求接口的超时时间(秒),防止假死的程序一直不响应
API_TIMEOUT=6#日志存放路径,用于查看什么时间自动帮你重启了应用
LOGPATH=/data//auto/autoRun.log# 使用curl请求接口并测量响应时间
RESPONSE=$(curl -o /dev/null -m $API_TIMEOUT -s -w "%{time_total}|%{http_code}" "$API_URL1")
# 解析响应时间和状态码
RESPONSE_TIME=$(echo $RESPONSE | awk -F'|' '{print $1}')
STATUS_CODE=$(echo $RESPONSE | awk -F'|' '{print $2}')echo curl $API_URL1 resptime=$RESPONSE_TIME code=$STATUS_CODE
# temp就是判断响应时间是否超过了超时时间
temp=$(echo "$RESPONSE_TIME > $TIMEOUT" | bc -l)
# 检查响应时间是否超过超时时间,这边判断的是响应码 200 和 超时时间 二选一
if ([ "$STATUS_CODE" -ne "200" ] || [ "$temp" -eq 1 ] ); then# 执行远程脚本echo $(date "+%Y-%m-%d %H:%M:%S") >> $LOGPATHecho curl $API_URL1 resptime=$RESPONSE_TIME code=$STATUS_CODE >> $LOGPATHecho 远程服务器14  假死了!重启14服务器对应服务echo 远程服务器14  假死了!重启14服务器对应服务 >> $LOGPATH# 这里是本机所以直接重启本地脚本,远程的服务器看下个用例,这里脚本需要实现自动关闭现有应用并启动,可以参考https://blog.csdn.net/kkillala/article/details/136052698 第三点sh /data/xxx/01startup-ucapp.shfi# 使用curl请求接口并测量响应时间
RESPONSE=$(curl -o /dev/null -m $API_TIMEOUT -s -w "%{time_total}|%{http_code}" "$API_URL2")
# 解析响应时间和状态码
RESPONSE_TIME=$(echo $RESPONSE | awk -F'|' '{print $1}')
STATUS_CODE=$(echo $RESPONSE | awk -F'|' '{print $2}')echo curl $API_URL2 resptime=$RESPONSE_TIME code=$STATUS_CODE
temp=$(echo "$RESPONSE_TIME > $TIMEOUT" | bc -l)
# 检查响应时间是否超过超时时间
if ([ "$STATUS_CODE" -ne "200" ] || [ "$temp" -eq 1 ] ); then# 执行远程脚本echo $(date "+%Y-%m-%d %H:%M:%S") >> $LOGPATHecho curl $API_URL2 resptime=$RESPONSE_TIME code=$STATUS_CODE >> $LOGPATHecho 远程服务器15 假死了!重启服务器对应服务echo 远程服务器15 假死了!重启服务器对应服务 >> $LOGPATH# 这里是通过ssh 远程到其他服务器并重启应用,需要先设置服务器免密访问 参考 https://blog.csdn.net/kkillala/article/details/136052698 第一点ssh root@192.168.0.15 "/data/xxx/01startup-ucapp.sh" sleep 10
fi# 使用curl请求接口并测量响应时间
RESPONSE=$(curl -o /dev/null -m $API_TIMEOUT -s -w "%{time_total}|%{http_code}" "$API_URL3")
# 解析响应时间和状态码
RESPONSE_TIME=$(echo $RESPONSE | awk -F'|' '{print $1}')
STATUS_CODE=$(echo $RESPONSE | awk -F'|' '{print $2}')echo curl $API_URL3 resptime=$RESPONSE_TIME code=$STATUS_CODE
temp=$(echo "$RESPONSE_TIME > $TIMEOUT" | bc -l)
# 检查响应时间是否超过超时时间
if ([ "$STATUS_CODE" -ne "200" ] || [ "$temp" -eq 1 ] ); then# 执行远程脚本echo $(date "+%Y-%m-%d %H:%M:%S") >> $LOGPATHecho curl $API_URL3 resptime=$RESPONSE_TIME code=$STATUS_CODE >> $LOGPATHecho 远程服务器16 假死了!重启服务器对应服务echo 远程服务器16 假死了!重启服务器对应服务 >> $LOGPATHssh root@192.168.0.16 "/data/xxx/01startup-ucapp.sh" sleep 10
fi# 使用curl请求接口并测量响应时间
RESPONSE=$(curl -o /dev/null -m $API_TIMEOUT -s -w "%{time_total}|%{http_code}" "$API_URL4")
# 解析响应时间和状态码
RESPONSE_TIME=$(echo $RESPONSE | awk -F'|' '{print $1}')
STATUS_CODE=$(echo $RESPONSE | awk -F'|' '{print $2}')echo curl $API_URL4 resptime=$RESPONSE_TIME code=$STATUS_CODE
temp=$(echo "$RESPONSE_TIME > $TIMEOUT" | bc -l)
# 检查响应时间是否超过超时时间
if ([ "$STATUS_CODE" -ne "200" ] || [ "$temp" -eq 1 ] ); then# 执行远程脚本echo $(date "+%Y-%m-%d %H:%M:%S") >> $LOGPATHecho curl $API_URL4 resptime=$RESPONSE_TIME code=$STATUS_CODE >> $LOGPATHecho 远程服务器20  假死了!重启服务器对应服务echo 远程服务器20  假死了!重启服务器对应服务 >> $LOGPATHssh root@192.168.0.20 "/data/xxx/01startup-ucapp.sh"sleep 10
fi# 使用curl请求接口并测量响应时间
RESPONSE=$(curl -o /dev/null -m $API_TIMEOUT -s -w "%{time_total}|%{http_code}" "$API_URL5")
# 解析响应时间和状态码
RESPONSE_TIME=$(echo $RESPONSE | awk -F'|' '{print $1}')
STATUS_CODE=$(echo $RESPONSE | awk -F'|' '{print $2}')echo curl $API_URL5 resptime=$RESPONSE_TIME code=$STATUS_CODE
temp=$(echo "$RESPONSE_TIME > $TIMEOUT" | bc -l)
# 检查响应时间是否超过超时时间
if ([ "$STATUS_CODE" -ne "200" ] || [ "$temp" -eq 1 ] ); then# 执行远程脚本echo $(date "+%Y-%m-%d %H:%M:%S") >> $LOGPATHecho curl $API_URL5 resptime=$RESPONSE_TIME code=$STATUS_CODE >> $LOGPATHecho 远程服务器21  假死了!重启服务器对应服务echo 远程服务器21  假死了!重启服务器对应服务 >> $LOGPATHssh root@192.168.0.21 "/data/xxx/01startup-ucapp.sh" sleep 10
fi

最后我们通过服务器的crond定时任务计划加入即可实现定时查询监听的功能。

crontab -e

2、添加如下配置,时间可更改,保存配置;

          • command

分 时 日 月 周 命令

其中,

第1列表示分钟,1~59,每分钟用*表示

第2列表示小时,1~23,(0表示0点)

第3列表示日期,1~31

第4列表示月份,1~12

第5列表示星期,0~6(0表示星期天)

第六列表示要运行的命令。

比如每天13:00、16:00生成:

0 13 * * * sh backup.sh start

00 23 * * 0 sh /data/clean_nginx_log.sh start

0 16 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create

#3分钟执行一次
*/3 * * * * /path/to/urshell/autorun.sh

3、重启crontab

systemctl restart crond

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/14948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《NoSQL数据库技术与应用》 MongoDB副本集

《NoSQL数据库技术与应用》 教学设计 课程名称:NoSQL数据库技术与应用 授课年级: 20xx年级 授课学期: 20xx学年第一学期 教师姓名: 某某老师 2020年5月6日 课题 名称 第4章 MongoDB副本集 计划学时 8课时 内容 分析 独立模式可…

第四十四天 完全背包理论 | 518.零钱兑换||

1.dp[j]含义:容量为j的背包,有一些可重复放入的物品,放满这个背包的最大价值 完全背包中每个物品可以使用无数次:遍历背包时采用正序遍历 (对于纯完全背包问题)先遍历物品还是先遍历背包无所谓&#xff1…

C语言——⾼位优先与低位优先的不同之处是什么?

一、问题 C语⾔的最⼤特⾊就是可移植性好。根据机器类型的不同,⾼位优先与低位优先也不同。那么,最好的可移植的 C 程序应该同时适⽤这两种类型的计算机。下⾯了解⼀下⾼位优先与低位优先的不同之处。 二、解答 所谓的⾼位优先,就是最低的地…

GitHub的原理及应用详解(五)

本系列文章简介: GitHub是一个基于Git版本控制系统的代码托管平台,为开发者提供了一个方便的协作和版本管理的工具。它广泛应用于软件开发项目中,包括但不限于代码托管、协作开发、版本控制、错误追踪、持续集成等方面。 GitHub的原理可以简单…

使用docker-compose部署时序数据库InfluxDB1.8.4

背景 如今 InfluxDB 已经更新到了 2.x , InfluxDB 1.x 和 2.x 版本之间有几个主要的区别: 数据模型: 1.x:使用数据库和保留策略来组织数据。 2.x:引入了组织(organizations)和存储桶&#xff…

Mac | 关于 Mac 桌面文件无法显示

现象问题 电脑配置:MacBook Pro M1,系统 Ventura 13.6.7 最近在不知道是不是安装了什么软件,导致桌面上的文件看不到了,但是在访达里的桌面还是可以看到文件,而且开启台前调度的时候,也不会返回桌面了。检查…

牛客NC236 最大差值【simple 动态规划 Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/a01abbdc52ba4d5f8777fb5dae91b204 思路 不难看出该题可以使用动态规划的方式解题。 在循环数组的过程中,记录截止到当前位置-1的最小值, 然后用当前的值去计算最大的差值。Java代码 im…

Spring Boot中集成 SSE

目录 SSE简介SSE原理SSE的使用场景在Spring Boot中集成SSE 创建Spring Boot项目添加依赖创建SSE控制器前端使用SSE详细案例:股票价格实时推送 总结 SSE简介 服务器发送事件(Server-Sent Events,SSE)是一种在HTTP协议上实现的服…

QT--splitter的使用

提示:本文为学习记录,若有错误,请联系作者,谦虚受教。 文章目录 前言一、实现步骤二、使用步骤1.新建splitter2.splitter的使用3.splitter大小 总结 前言 一、实现步骤 创建 QTabWidget:首先,确保你有一个…

融媒宝:群发自媒体平台的神器,注册送7天中级会员

近几年自媒体比较火,做自媒体往往需要发布文章或视频到多个平台,如手工复制粘贴逐一发布,委实费时费力、效率不高。今天就给大家分享一款提高自媒体运营效率的神器--融媒宝: 融媒宝简介 融媒宝是一款可免费使用的高效自媒体工具…

嵌入式学习记录5.20(TCP并发服务器)

目录 一. TCP并发服务器 二 .多进程实现TCP并发服务器 2.1流程框架 2.2具体实现代码 三. 多线程实现并发服务器 3.1流程框架 3.2具体实现 一. TCP并发服务器 1> 由于循环服务器使用时,只能等到上一个客户端处理结束后,才能处理下一个客户端 2&…

22个C语言小白常见问题总结

一.语言使用错误 在打代码的过程中,经常需要在中文与英文中进行转换,因此常出现一些符号一不小心就用错,用成中文。例如:“;”中文中的分号占用了两个字节,而英文中“;”分号只占用一个字节。编译器只能识…

Scala的简单学习一

一 相关知识 1.1 scala的安装 1.在idea中导入依赖,并在Idea下载scala插件 1.2 scala基础知识点 1.scala代码中一行语句的结束是以换行符为标准,可以不用写分号 2.class是一个普通的类,object相当于一个单例对象,object类中的…

OpenStack配置 之 不同cpu迁移虚拟机

介绍 OpenStack是一个开源的云计算管理平台项目,是一系列软件开源项目的组合。 OpenStack由NASA(美国国家航空航天局)和Rackspace合作研发并发起,以Apache许可证(Apache软件基金会发布的一个自由软件许可证&#xff…

《Google 软件工程》读书笔记

1. 写在前面 在图书馆瞎逛,偶然瞄见一本《Google 软件工程》Titus Winters, Tom Manshreck, Hyrum Wright 著。主要是在这一排的书架上就这本书看着挺新的(不知道为什么有一种喜欢看新书的情节),而且最近被领导老批评,…

Python 一个简单的用Canny算法进行边缘检测程序

以下是一个简单的边缘检测程序,使用Python和OpenCV库来实现。这个程序将加载一张图像,对其进行灰度化处理,并使用Canny边缘检测算法来检测图像中的边缘。请确保安装了OpenCV库(可以使用pip install opencv-python进行安装&#xf…

Vue的router.addRoutes不起作用

Vue的router.addRoutes()不起作用解决方案 最近在学习制作后台管理系统的时候,涉及到了权限,在通过后台获取到数据后使用router.addRoutes()时不起作用。 最终发现左侧菜单组件中的路由是根据this.$router.options.routes来渲染的,最终使用…

sw套合样条曲线

套合样条曲线,可以变成一条曲线,然后可以进行分段

UOS1060e分离ssh与sftp服务

文章目录 原理一、sftp 用户与目录二、ssh 和 sftp 服务分离三、启动与停止四、验证 原理 SFTP是SSH的一部分,SFTP没有单独的守护进程,它必须使用SSHD守护进程(端口号默认是22)来完成相应的连接操作。 通过新建另一个‘sshd’进程…