Jenkins總結3-shell腳本


 

  我寫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


免責聲明!

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



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