我寫shell腳本的功力還很初級,基本都是現學現賣,寫得不是很健壯,只能提供個思路,請大家包涵。
我使用的系統只能發函數放到shell最前面。本人還是比較推崇函數式腳本的,方便復用,目前只簡單的封裝了兩個。
1. 判斷jar包是否運行,在項目停機前,啟動后都可以用到。
# 判斷jar包是否正在運行
is_exist(){
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'` if [ -n "$pid" ]; then return 0 else return 1 fi }
2. 停止項目
# 停止程序
stop(){
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'` if [ -n "$pid" ]; then echo '停止pid='$pid kill $pid > /dev/null 2>&1 count=`ps --no-heading -C java -f --width 2000 | grep $JAR_NAME | awk '{print $2}' | wc -l` if [ $count -gt 0 ]; then # 等5秒,盡量讓程序優雅停機,之后再強制殺死進程 sleep 5 kill -9 $pid > /dev/null 2>&1 sleep 1 fi fi }
3. 判斷參數數量,並接受參數。我這個腳本有2個參數,第二個參數在后面直接用$2使用。
# 接收參數, 項目名稱
if [[ $# == 2 ]]; then PROJECT_NAME=$1 echo '接收到的項目名稱參數='$PROJECT_NAME else echo '參數不全,無法執行!!!' exit 1 fi
4. 接下來可以提前名稱項目目錄,並拼接項目jar目錄,日志目錄等。
5. 啟動項目。$2是腳本的第二個參數,內存數量,單位M,$JAR_PATH是拼接好的jar包全路徑。 並使用nohup后台運行。因為前台運行jar命令會造成jenkins會一直打印部署日志,shell腳本不能退出,最終jenkins部署超時。
nohup /usr/local/java/bin/java -Xms$2m -Xmx$2m -jar $JAR_PATH > $OUT 2>&1 &
6. 打印項目啟動日志(方式1)
這個方法簡單粗暴,在前面執行完java命令之后,等待一段時間,我這里設置的是50秒,然后調用is_exist函數判斷線程是否啟動,之后打印判斷結果和最后100行的啟動日志。
會打印一些多余的日志,如果項目打印日志太快可能是看不到啟動日志的。
# 等待50秒,再判斷程序是否啟動 sleep 50 is_exist # 打印啟動日志 if [ $? -eq 0 ]; then echo $JAR_NAME'發布成功!請查看日志' tail -100 $LOG_FILE exit 0 else echo $JAR_NAME'發布失敗!請查看日志' tail -100 $LOG_FILE exit 1 fi
7. 打印項目啟動日志(方法2)
獲取當前系統的日期和小時,$LOG_FILE是我日志文件路徑,循環grep判斷日志中是否出現了啟動成功的關鍵字“started successfully”,如果超過45秒還沒有提示超時。
待完善的地方:因為判斷時間只精確到小時,如果一小時內項目重啟多次,可能只會打印其中一次的日志,並不一定是最新的。如果精確時間到分鍾,在項目啟動時時間如果跨了分鍾,有可能會判斷不到。
最后一行是輸出啟動日志“Initializing ProtocolHandler”是我項目啟動的第一行日志,判斷從這一行開始打印向下100行日志。
today=`date +%Y-%m-%d` hour=`date +%H` seconds=0 while [ -f $LOG_FILE ] do result=`grep "$today $hour" $LOG_FILE | grep "started successfully"` if [ -n "$result" ]; then echo "項目已啟動........." break else echo "啟動中.......已耗時$seconds秒" sleep 1s let seconds+=1; fi if [ ${seconds} -ge 45 ]; then echo "啟動超時,45秒,自動退出"; break; fi done echo $JAR_NAME"啟動成功" # 打印啟動日志 grep "$today $hour" $LOG_FILE | grep -A 100 'Initializing ProtocolHandler'
started successfully
