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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM