宕机监测及自动重启脚本
一、直接检测进程是否还在
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