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>

 

posted @ 2019-12-20 20:29  fyhsACr  阅读(1449)  评论(0编辑  收藏  举报