前言
因为写了个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