• 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>
  • 相关阅读:
    Java多线程总结之线程安全队列Queue
    Android模拟器Genymotion使用详解
    Failed to resolve:com.android.support:appcompat-v7:报错处理
    第一次使用Android Studio时你应该知道的一切配置
    sdk manager 打不开
    Android app设置全屏模式
    Android设备与外接U盘实现数据读取操作
    IIS相关优化
    集群、负载均衡、分布式
    docker启动
  • 原文地址:https://www.cnblogs.com/fyhsACr/p/12074935.html
Copyright © 2020-2023  润新知