項目由於接入數據量過大,導致通信程序頻繁重啟,將項目重構之后還出現這個問題,無奈之下只好寫了一個自動重啟的腳本。
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>