宕机监测及自动重启脚本

宕机监测及自动重启脚本

一、直接检测进程是否还在

1.1 脚本

直接检测进程是否存在,存在则忽略,不存在则重启程序(也可添加告警)。

#!/bin/bash
#jar包和日志文件存放位置--改成自己的
dir=/usr/tmp/test/test07
#jar包名称--改成自己的
process=jvm1-0.0.1-SNAPSHOT.jar
#查看jar包运行进程的pid
pid=$(ps -ef | grep $process | grep 'java' | grep -v grep | awk '{print $2}')
#如果进程不存在,重启jar包服务
if [ -z  "$pid" ];
then
    source /etc/profile
    nohup java -Xms10m -Xmx10m -Xmn2m -Xss1m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./error/ -jar $dir/$process --server.port=8092 >> $dir/restart_log.log  2>&1 &
    echo $(date +"%Y-%m-%d %T")"__程序宕机,自动重启" >> $dir/restart_info.log
fi
#如果进程存在写日志,此处需要放开注释即可
if [ -n "$pid" ];
then
    echo $(date +"%Y-%m-%d %T")"__程序已启动,无需重启" >> $dir/restart_info.log
fi

1.2 定时执行脚本

利用linux系统的cron任务计划表设置定时任务执行脚本,实现定时轮询检测的功能。

crontab -e
#在定时任务中设定任务,5分钟检查一次
*/5 * * * * sh /home/myTest/start.sh

1.3 设置文件格式

如果是在windows下编辑,在linux下执行shell脚本,大概率会报错。可以通过vi编辑器打开文件进行文件格式的设置。如下:

:set ff
#如果是 fileformat=doc 则需要设置
:set ff=unix

二、通过接口检测

2.1 脚本

#!/bin/bash
dir=/usr/tmp/test/test07
process=jvm1-0.0.2-SNAPSHOT.jar
URL=127.0.0.1:8093/test01/a4
 
FAIL_COUNT=0                #设置一个变量来统计访问失败次数
 
for ((i=1;i<=3;i++)); do
    #最大超时时间是3秒超时返回错误码000;此处如果是post请求需要增加-X POST
    HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -m 3 -s -w "%{http_code}" -X POST $URL)    
    if [ $HTTP_CODE -eq 200 ]; then
        echo "$URL OK"      #访问正常打印ok
        break
    else
        echo "$URL retry $FAIL_COUNT"
        let FAIL_COUNT++            #如果不ok的话就执行计数加一
    fi
done

#如果FAIL_COUNT=3,就重启;FAIL_COUNT次数自己定义
if [ $FAIL_COUNT -eq 3 ]; then              
  # 获取pid,如果有进程则判断程序为假死,kill并restart;没有进程则直接restart
	pid=$(ps -ef | grep $process | grep 'java' | grep -v grep | awk '{print $2}')   
	if [ -z  "$pid" ]; then
        nohup java -Xms10m -Xmx10m -Xmn2m -Xss1m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./error/ -jar $dir/$process --server.port=8093 >> $dir/restart_log.log  2>&1 &
        echo $(date +"%Y-%m-%d %T")"__程序不可用,自动重启"
  fi
	if [ -n "$pid" ]; then
	    kill -15 $pid
      sleep 10
	    nohup java -Xms10m -Xmx10m -Xmn2m -Xss1m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./error/ -jar $dir/$process --server.port=8093 >> $dir/restart_log.log  2>&1 &
      echo $(date +"%Y-%m-%d %T")"__程序宕机,自动重启"
	fi
fi

2.2 告警通知脚本

在上述脚本的出错条件里可以增加告警脚本。具体实现方式其实就是设置一个回调地址供访问(需要打通机器网络),可以借鉴网络上的脚本,利用企业微信群机器人,进入开发者模式获取到回调地址,然后就可以在企业微信群里发出告警通知了。

if [ $FAIL_COUNT -eq 3 ]; then              
    echo "Warning: $URL Access failure!"
    error_msg="异常提醒error:$URL"
    msg_body="{\"msgtype\":\"text\",\"text\":{\"content\":\"$error_msg\"}}"
    WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=eae02527"
    req_msg=$(curl -s -H "Content-Type: application/json" -X POST -d $msg_body $WEBHOOK_URL )

    echo "触发报警:" $req_msg
fi

2.3 参数化

在生产环境无权限,不知道参数的情况下让运维自己输入参数,同时也有利于跨服务复用脚本。

#!/bin/bash

#dir=/usr/tmp/test/test0711
#process=jvm1-0.0.2-SNAPSHOT.jar
#URL=127.0.0.1:8093/test01/a4

dir=$1
process=$2
URL=$3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值