Linux监控SpringBoot的Jar方式运行的进程并且重启

10 篇文章 0 订阅

前言

因为写了个SpringBoot的程序,以Jar方式运行,次用了内嵌Tomcat作为容器;在程序启动后,如果程序挂了,那服务就会出现问题,所以需要增加一个监控进程存活并且可以进行重新启动程序的脚本。

程序启动脚本(start.sh)

server.jar的启动脚本,可以用在其他也是jar启动的程序里,需要记得替换对应的jar名字和一些路径,下列是start.sh脚本的内容。

#!/bin/bash

source /etc/profile
#指定要运行的jar的home目录
export JAR_HOME=/home/server/
#OOM时导出的堆栈日志
export HEAP_DUMP=-XX:+HeapDumpOnOutOfMemoryError

#GC日志
export GC_LOG_OPT="-XX:+PrintCommandLineFlags -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/server/gc.log"

#调试用JMC Config
#export JMC_OPT=" -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=xxx -Dcom.sun.management.jmxremote.port=9090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

export JVM_OPT=" -server -Xmn512M -Xms1G -Xmx1G -XX:PermSize=256M -XX:MaxPermSize=256M"

#调试用
#export JPDA_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005'

#kill old process
ps -ef|grep server.jar|grep -v grep|awk  '{print "kill -9 " $2}'|sh
#睡眠一下的原因是过快会导致旧的进程未退出就执行启动,导致启动失败。
sleep 2

#后台启动程序,启动日志记录到nohuplog.txt
nohup $JAVA_HOME/bin/java $JVM_OPT $JPDA_OPTS $HEAP_DUMP $JMC_OPT $GC_LOG_OPT  -jar  $JAR_HOME/server.jar  1 >> $JAR_HOME/logs/nohuplog.txt  2>&1 &
echo "server started"

脚本检测(aliveCheck.sh)

检测的脚本的思路很简单。
1.通过ps -ef查找指定的进程ID
2.判断进程ID是否存在,不存在则表示进程不存在需要启动。

如下server.jar就是我的SpringBoot的程序,下列是我的脚本,需要注意的是脚本的路径;如我的启动脚本为/home/server/start.sh,建议使用绝对路径。

#!/bin/bash
#查找进程
process_id=`ps -ef|grep server.jar|grep -v grep|awk  '{print  $2}'`
if [ "$process_id" == "" ];then
   sleep 1
   echo "process has exit.";
   echo "process be going to restart.";
   #执行启动脚本
   sh /home/server/start.sh;
else
   #如果存在则打印进程ID
   echo "process id is $process_id."
   echo "process exists.";

fi

执行检测脚本

方式1:定时检测任务

将检测脚本配置成定时任务,使用crontab来配置,执行crontab -e,然后配置如下。

#表示每分钟检查一次
* * * * * sh /home/server/aliveCheck.sh

讲真这个每分钟检查一次似乎不能满足需求,因为如果程序挂了,则最大会有1分钟+程序启动时间的不可用时间。如果希望缩短检测时间,则可以直接改造下上去的检测脚本,在检测脚本外面加个while(true)的循环+sleep 1实现每秒检查一次。虽然很简单,还是粘贴下改造后的脚本吧。

方式2:改造检测脚本,添加循环逻辑

在检测脚本外面加个while(true)的循环+sleep 1实现每秒检查一次,具体脚本如下所示。

#!/bin/bash
#循环间隔指定时间做进程是否存活的检测。
while true
do
  #指定检测的间隔
  sleep 1
  #查找进程
  process_id=`ps -ef|grep server.jar|grep -v grep|awk  '{print  $2}'`
  if [ "$process_id" == "" ];then
     sleep 1
     echo "process has exit.";
     echo "process be going to restart.";
     #执行启动脚本
     sh /home/server/start.sh;
  else
     #如果存在则打印进程ID
     echo "process id is $process_id."
     echo "process exists.";
  fi
done

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值