Jar包运行的守护进程+定时器
项目由于接入数据量过大,导致通信程序频繁重启,将项目重构之后还出现这个问题,无奈之下只好写了一个自动重启的脚本。
1.先写一个xxx_process_protection.sh脚本,以保证项目能够以脚本运行。
1 #!/bin/bash 2 # @author ShunpingHe 3 # @date 2019/12/20 4 #引入java环境变量,是因为通过定时器重启时,定时器是没有环境变量的,导致重启不成功,此时要在脚本中加入环境变量。 5 export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64 6 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 7 export PATH=$PATH:$JAVA_HOME/bin 8 #时间 9 TIME=$(date "+%Y-%m-%d %H:%M:%S") 10 #需要启动并监测服务的路径,dirname不用改。 11 JAR_PATH=$(cd $(dirname $0); pwd) 12 echo "-------${TIME}-------需要启动并监测服务的路径:"${JAR_PATH} 13 #遍历文件夹下所有的jar包 14 for JAR in `ls -l ${JAR_PATH}/*.jar | awk '{print $9}'` 15 do 16 #jar包名称 17 JAR_NAME=$(ol-conn $JAR) 18 #单个jar包地址 19 echo "--------正在检测jar:"${JAR_NAME} 20 echo "jar包地址:"${JAR} 21 #jar包目录,basename也不用改 22 JAR_PARH=$(basename $JAR) 23 echo "jar包目录:"${JAR_PARH} 24 #获取程序运行情况 25 PID=`ps -ef |grep $(echo $JAR | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'` 26 #判断进程是否已经启动,启动继续下一个检测 27 if [ -n "$PID" ];then 28 #抛出提示 29 echo "$JAR_NAME:正在运行,PID=$PID" 30 else 31 #启动服务 32 exec nohup java -Xms8g -Xmx8g -jar $JAR >/dev/null 2>&1 & 33 #获取PID 34 PID=`ps -ef |grep $(echo $JAR | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'` 35 echo "启动时PID:${PID}" 36 #自循环判定是否启动 37 COUNT=0 38 while [ -z "$PID" ] 39 do 40 #一定时间内服务未启动抛出错误提示并终止启动程序 41 if (($COUNT == 30));then 42 #启动失败 43 echo "$JAR_NAME:$(expr $count \* 10)秒内未启动,请检查!" 44 break 45 fi 46 count=$(($count+1)) 47 #启动过程输出提示 48 echo "$JAR_NAME 启动中.................." 49 #时间阻断:10s 50 sleep 10s 51 #获取PID 52 PID=`ps -ef |grep $(echo $JAR | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'` 53 echo "启动后循环PID:${PID}" 54 done 55 echo "$JAR_NAME:已经启动成功,PID=$PID" 56 fi 57 #换行 58 echo "" 59 done
需要注意的是,如果在windows下编辑的脚本,拷贝进linux系统中,会导致出现^M的找不到文件的错误。这是因为脚本是dos格式的,不是unix格式的,需要重新设置一下格式。
2.定时器配置
通过crontab -e命令在文件后面增加一行:*/3 * * * * /home/XXX/XXX_process_protection.sh >/home/XXX/XXX_process_protection.log 2>&1
然后重启定时器服务就好了。
---更新于2019-12-23
最新发现,用定时器定时启动的时候,它无法将日志打印进我设定好的目录结构下,原因是它没办法从项目中识别./logs。所以要在log4j的配置文件里面加上绝对路径。。。
<Property name="APP_NAME">ol-web</Property> <Property name="LOG_FILE_PATH">/home/web/weblogs</Property>