linux jar包自启动与进程监控重启

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
    查看是否按照crontab
  • systemctl status crond.service
  • linux jar包自启动与进程监控重启_第1张图片
  • 设置定时任务
    */1 * * * * sh /项目根目录/process_protection.sh > /项目根目录/process_protection.log 2>&1

##效果展示

  • 运行结果
    linux jar包自启动与进程监控重启_第2张图片

  • reboot后照常执行定时任务

你可能感兴趣的:(linux jar包自启动与进程监控重启)