centos環境啟動/重啟java服務腳本優化
- 引
- 部分命令說明
- 根據端口查詢服務進程
- 殺死進程
- 函數腳本接收參數
- 腳本
- 注意
- 重啟
- 文檔位置
- 異常
引
在離線環境部署的多個java應用組成的系統,測試階段需要較為頻繁的發布,因資源限制,沒有弄devops或CICD那套,就簡單的打包成jar進行發布。之前弄了腳本進行啟動,啟動前需要根據端口收到的殺掉進程再啟動,否則會出現端口沖突導致啟動失敗,優化點之一就是要支持腳本自動重啟,自動找到對應的進程再殺死重啟。另外一點就是日志文件,重啟后會根據服務名和當前時間生成新的日志文件,查詢日志的時候如果有多個前綴的文件時,需要手動選擇,比較麻煩,就想著將歷史日志文件歸檔到當前路徑下的backup文件夾中。
部分命令說明
首先聲明本人shell菜鳥,對這塊兒使用很少。
根據端口查詢服務進程
這個我比較喜歡使用lsof命令,比如查詢8080端口占用的進程可以使用一下命令
lsof -i:8080
殺死進程
這個應該都懂,kill -9,不要簡單使用kill,比如殺死進程PID為12345的進程
kill -9 12345
函數腳本接收參數
這個比較簡單命令,函數的參數依此使用$1
,$2
,$3
…進行接收
腳本
因為是多個java服務,同時也秉承復用的思想,想著寫個通用的方法進行服務的重啟,再寫多個服務對應的腳本記錄好各自的服務名和端口等信息,在服務各自的腳本中傳參調用通用的服務啟動或重啟方法。
通用服務啟動或重啟腳本 run.sh
#!/bin/bashstart_app(){# 接收參數APP_NAME=$1;APP_PORT=$2;MEM=$3ACTION=$4;CURRENT_TIME=`date +"%Y%m%d%H%M%S"`#檢查程序是否在運行APP_STATUS=`netstat -nlt|grep ${APP_PORT} |wc -l`;RUNNING_PID=$(netstat -nlp | grep :$APP_PORT | awk '{print $7}' | awk -F"/" '{ print $1 }');LOG_FILE=./logs/${APP_NAME}_${CURRENT_TIME}.log;cd ..;if [ "${APP_STATUS}" -eq 1 ]; thenif [ "${ACTION}"x == "restart"x ]; then## 重啟前先kill原進程echo "kill the running app whose PID is ${RUNNING_PID} of ${APP_NAME}";kill -9 "${RUNNING_PID}";# 日志歸檔cd logs;for file in `ls ${APP_NAME}* -a`;domv "${file}" backup/;donecd ..;elseecho "exist running ${APP_NAME} and the PID is ${RUNNING_PID}";exit 0;fifiecho "start ${APP_NAME} at $CURRENT_TIME";## 啟動程序nohup java -Xms${MEM}m -Xmx${MEM}m -XX:PermSize=256m -XX:MaxPermSize=512m -jar -Dfile.encoding=utf-8 -Dserver.port=${APP_PORT} -Dspring.profiles.active=prod ${APP_NAME} > ${LOG_FILE} 2>&1 &pid=`ps -ef|grep java|grep ${APP_NAME}`echo "${APP_NAME} has started successfully at ${CURRENT_TIME},and the pid is ${pid}"
}
單個的服務啟動腳本
#!/bin/bash
action=$1
## 引入通用服務啟動腳本
source ./run.sh
#啟動方法
start(){# 執行通用服務腳本中的啟動方法start_app xxx.jar 8080 4096 ${action}
}#程序主入口
start
注意
重啟
直接執行服務啟動腳本不傳參數的情況,會判斷服務端口是否占用,占用則直接退出,傳restart則會在服務啟動的情況下先殺死原服務進程再重新啟動。
文檔位置
jar包位于/opt/app目錄下,腳本位于/opt/app/run目錄下,日志放在了/opt/app/logs目錄下,目前這個版本只能支持在腳本當前目錄執行,如果使用絕對路徑的方式會報錯,應該是腳本中的一些寫法沒有使用絕對路徑所致,各有利弊,暫時保留此方案。
異常
測試過程中遇到了run.sh: xxx行 $'\r' 附近有語法錯誤
的錯誤,使用sed -i ‘s/\r$//’ run.sh命令轉換就行了。