linux jar包自启动与进程监控重启
- 前期调研
- 实现效果
- 使用说明
- 第一步
- 第二步
前期调研
共调研三个技术:
- systemctl:systemctl 系统自动,效率高,实现效果也很好。但是会存在主进程和子进程的概念,实践过程中这种方法没法监测每一个子进程,只能监控最后一个进程是否死掉(目前作者未找到,可再研究)
- while:脚本无线循环,出现问题的几率会很大
- crontab:系统定时任务,最终采用该方案,crontab系统自带,无需维护(但是有可能需要启动),crond.service自启动,就节约设置自启动步骤。实现自启动与检测两个功能
实现效果
每分钟检测脚本所在子文件夹下所有java jar进程,如果进程停止则立刻自动重启。
使用说明
部署目录结构(必须遵守该结构),如:
#--------IFOX
#----短信服务(sms-service)
#----地区服务(area-service)
#----脚本process_protection.sh
第一步
- 创建检测jar包脚本 process_protection.sh:
#!/bin/bash
# @author xiaotao
# @date 2019/8/22
#时间
TIME=$(date "+%Y-%m-%d %H:%M:%S")
#需要启动并监测服务的路径
JAR_PATH=$(cd $(dirname $0); pwd)
echo "-------${TIME}-------需要启动并监测服务的路径:"${JAR_PATH}
#遍历文件夹下所有的jar包
for JAR in `ls -l ${JAR_PATH}/*/*.jar | awk '{print $9}'`
do
#jar包名称
JAR_NAME=$(basename $JAR)
#单个jar包地址
echo "--------正在检测jar:"${JAR_NAME}
echo "jar包地址:"${JAR}
#jar包目录
JAR_PARH=$(dirname $JAR)
echo "jar包目录:"${JAR_PARH}
#获取程序运行情况
PID=`ps -ef |grep $(echo $JAR | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
#判断进程是否已经启动,启动继续下一个检测
if [ -n "$PID" ];then
#抛出提示
echo "$JAR_NAME:正在运行,PID=$PID"
else
#启动服务
exec nohup java -Xms256m -Xmx256m -Xmn200m -Xss256k -jar $JAR >> $JAR_PARH/catalina.out 2>&1 &
#获取PID
PID=`ps -ef |grep $(echo $JAR | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
echo "启动时PID:${PID}"
#自循环判定是否启动
COUNT=0
while [ -z "$PID" ]
do
#一定时间内服务未启动抛出错误提示并终止启动程序
if (($COUNT == 30));then
#启动失败
echo "$JAR_NAME:$(expr $count \* 10)秒内未启动,请检查!"
break
fi
count=$(($count+1))
#启动过程输出提示
echo "$JAR_NAME 启动中.................."
#时间阻断:10s
sleep 10s
#获取PID
PID=`ps -ef |grep $(echo $JAR | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
echo "启动后循环PID:${PID}"
done
echo "$JAR_NAME:已经启动成功,PID=$PID"
fi
#换行
echo ""
done
- 上传脚本到linux部署根目录下
- 设置process_protection.sh为可执行文件
chmod +x process_protection.sh
第二步
- 查看是否安装crontab
执行命令crontab -l - systemctl status crond.service
- 设置定时任务
*/1 * * * * sh /项目根目录/process_protection.sh > /项目根目录/process_protection.log 2>&1
##效果展示
- 运行结果
- reboot后照常执行定时任务