简述
服务器最近经常出现jar运行一段时间后自动停止,可能原因是服务器资源不足,例如内存不够用;
shell自动重启服务脚本制作
文件名称:monitor.sh
完整版:
#!/bin/bash
# “#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行
# 变量
jarName=test.jar
jarUrl=/data/solitasu
webUrl=https://www.baidu.com/
# grep -v grep: 在文档中过滤掉包含有grep字符的行
# awk '{print $2}': 按空格截取第二个
pid=`ps -ef|grep $jarName |grep -v grep| awk '{print $2}'`
# wc -l: jar包进程的数量
num=`ps -ef|grep $jarName |grep -v grep| awk '{print $2}'| wc -l`
MonitorFunction(){
# 输出文本
echo "[info]进入监控脚本"`date +'%Y-%m-%d %H:%M:%S'`
# -eq: 等于
if [[ $num -eq 0 ]]; then
echo "[error]进程不存在,重启"`date +'%Y-%m-%d %H:%M:%S'`
# >> /dev/null : jar包生成日志不打印到此脚本日志中
java -jar $jarUrl/$jarName >> /dev/null &
else
# 获取页面访问状态
# -m 10: 最多查询10s --connect-timeout 10:10秒连接超时 -o /dev/null: 屏蔽原有输出信息 -s: silent -w %{http_code}: 控制额外输出
code=`curl -s -o /dev/null -m 10 --connect-timeout 10 $webUrl -w %{http_code}`
# -ne: 不等于
if [[ $code -ne 200 ]]; then
echo "[error]页面访问失败,code=$code,重启"`date +'%Y-%m-%d %H:%M:%S'`
kill -9 $pid
java -jar $jarUrl/$jarName >> /dev/null &
else
echo "[info]页面访问成功,code=$code,time="`date +'%Y-%m-%d %H:%M:%S'`
fi
fi
}
MonitorFunction
简化版
#!/bin/bash
# “#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行
# 变量
jarName=spsmartmanger-1.0.jar
jarUrl=/www/app/java
# grep -v grep: 在文档中过滤掉包含有grep字符的行
# awk '{print $2}': 按空格截取第二个
pid=`ps -ef|grep $jarName |grep -v grep| awk '{print $2}'`
# wc -l: jar包进程的数量
num=`ps -ef|grep $jarName |grep -v grep| awk '{print $2}'| wc -l`
MonitorFunction(){
# 输出文本
echo "[info]进入监控脚本"`date +'%Y-%m-%d %H:%M:%S'`
# -eq: 等于
if [[ $num -eq 0 ]]; then
echo "[error]进程不存在,重启"`date +'%Y-%m-%d %H:%M:%S'`
# >> /dev/null : jar包生成日志不打印到此脚本日志中
nuhop java -jar $jarUrl/$jarName &
fi
}
MonitorFunction
检查服务响应,通过接口调用返回状态判断
如果服务不响应,杀死服务进程。通过自动重启脚本重启服务
#!/bin/bash
# “#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行
# 该脚本用于监测接口响应状态,如果未响应,杀死服务线程,线程会自动启动,这里只需要实现杀死线程即可
#设置变量,url为你需要检测的目标网站的网址(IP或域名)
url=http://10.45.206.159:8089/spapi/CreateQZ/remove
jarName=spsmartmanger-1.0.jar
# awk '{print $2}': 按空格截取第二个
pid=`ps -ef|grep $jarName |grep -v grep| awk '{print $2}'`
# wc -l: jar包进程的数量
num=`ps -ef|grep $jarName |grep -v grep| awk '{print $2}'| wc -l`
check_http(){
status_code=$(curl -m 5 -s -o /dev/null -w %{http_code} --location --request POST $url --header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)' --header 'Content-Type: application/json' --data '{"uuid": "123"}')
}
check_http
date=$(date +%Y%m%d-%H:%M:%S)
echo "[$date]:发送请求,url:$url;返回状态码为:${status_code}." >> /www/app/java/monitor-aqsc.log
if [ $status_code -ne 200 ];then
echo "服务异常,执行后续工作" >> /www/app/java/monitor-aqsc.log
if [[ $num -ne 0 ]]; then
kill -9 $pid
echo "服务异常,关闭服务,pid为$pid" >> /www/app/java/monitor-aqsc.log
else
echo "服务异常,查询到线程为0" >> /www/app/java/monitor-aqsc.log
fi
else
echo "服务正常" >> /www/app/java/monitor-aqsc.log
fi
将monitor.sh脚本设为可执行
chmod a+x monitor.sh
定时执行脚本
进入编辑文件
# 查看和设置定时任务
crontab -e
增加定时任务
# 每一分钟执行一次并将日志打印在固定目录中,若文件不存在会自动创建
*/1 * * * * bash /www/app/java/monitor.sh >> /www/app/java/monitor.log