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

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

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

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

#!/bin/bash

#是否启用此脚本,用于更新程序的时候,先关闭,更新完成后再开启,0 否 1 是
ENABLE=1

# 检查 enable 的值,如果是0 就先不执行此脚本
if [ "$ENABLE" -eq 0 ]; then
    echo "脚本已禁用,停止执行。"
    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") >> $LOGPATH
    echo curl $API_URL1 resptime=$RESPONSE_TIME code=$STATUS_CODE >> $LOGPATH
    echo 远程服务器14  假死了!重启14服务器对应服务
    echo 远程服务器14  假死了!重启14服务器对应服务 >> $LOGPATH
    # 这里是本机所以直接重启本地脚本,远程的服务器看下个用例,这里脚本需要实现自动关闭现有应用并启动,可以参考https://blog.csdn.net/kkillala/article/details/136052698 第三点
    sh /data/xxx/01startup-ucapp.sh
    
fi

# 使用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") >> $LOGPATH
    echo curl $API_URL2 resptime=$RESPONSE_TIME code=$STATUS_CODE >> $LOGPATH
    echo 远程服务器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") >> $LOGPATH
    echo curl $API_URL3 resptime=$RESPONSE_TIME code=$STATUS_CODE >> $LOGPATH
    echo 远程服务器16 假死了!重启服务器对应服务
    echo 远程服务器16 假死了!重启服务器对应服务 >> $LOGPATH
    ssh 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") >> $LOGPATH
    echo curl $API_URL4 resptime=$RESPONSE_TIME code=$STATUS_CODE >> $LOGPATH
    echo 远程服务器20  假死了!重启服务器对应服务
    echo 远程服务器20  假死了!重启服务器对应服务 >> $LOGPATH
    ssh 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") >> $LOGPATH
    echo curl $API_URL5 resptime=$RESPONSE_TIME code=$STATUS_CODE >> $LOGPATH
    echo 远程服务器21  假死了!重启服务器对应服务
    echo 远程服务器21  假死了!重启服务器对应服务 >> $LOGPATH
    ssh 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
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值