分享兩個實用的shell指令碼

碼農Amg發表於2022-04-23

各位,早上好啊~ 發現許久沒有分享過技術文章了,今天分享兩個部署專案時候比較實用的shell指令碼

一鍵部署shell指令碼

由於個人部署,會習慣把jar放到lib目錄下面,如果你沒有這個習慣,可以適當做一些修改。該指令碼提供了一鍵啟動、停止、重啟、檢查操作

deploy.sh程式碼
#!/bin/bash

#這裡可替換為你自己的執行程式,其他程式碼無需更改

cd ../lib/
jar_path=`pwd`
APP_NAME=`ls -al  *.jar | awk '{print $9}'`
#使用說明,用來提示輸入引數
usage() {
    echo "Usage: sh robotcenter.sh [start|stop|restart|status]"
    exit 1
}

#檢查程式是否在執行
is_exist(){
  pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
  #如果不存在返回1,存在返回0     
  if [ -z "${pid}" ]; then
   return 1
  else
    return 0
  fi
}

#啟動方法
start(){
  is_exist
  if [ $? -eq 0 ]; then
    echo "${APP_NAME} is already running. pid=${pid}"
  else
    cd /home/dtx/common-shell
    echo `pwd`
    # 引入公用shell指令碼引數,可以自行考慮需不需要
    . common_params.sh
    echo "啟動堆大小: $java_mem_size"
    echo "------------------------------------------------------------------------------------------------------------"
    echo "java_gc: $java_gc"
    echo "------------------------------------------------------------------------------------------------------------"
    echo "啟動profile引數:$profile"
    cd ${jar_path}
    nohup java  ${java_mem_size} ${java_gc}  -jar ${APP_NAME} ${profile} >/dev/null 2>&1 &
    is_exist
    if [ $? -eq 0 ]; then
       echo "${APP_NAME} is running"
    else
       echo "${APP_NAME} is running failed"
    fi
    sleep 2
  fi
}

#停止方法
stop(){
  is_exist
  if [ $? -eq "0" ]; then
    kill -9 $pid
    echo "${APP_NAME} has stopped"
  else
    echo "${APP_NAME} is not running"
  fi  
}

#輸出執行狀態
status(){
  is_exist
  if [ $? -eq "0" ]; then
    echo "${APP_NAME} is running. Pid is ${pid}"
  else
    echo "${APP_NAME} is NOT running."
  fi
}

#重啟
restart(){
  stop
  sleep 5
  start
}

#根據輸入引數,選擇執行對應方法,不輸入則執行使用說明
case "$1" in
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "status")
    status
    ;;
  "restart")
    restart
    ;;
  *)
    usage
    ;;
esac

重啟效果如下

image-20220423103254891

彩色日誌操作

也是由於個人習慣,回把log4j列印的日誌放到logs檔案下面,可以自行做一些小調整即可

colorfullog.sh程式碼
#! /bin/bash
tail  -300f  ../logs/stdout.log | perl -pe's/(INFO)|(DEBUG)|(WARN)|(ERROR)|(^[0-9-:.\s]{10,23})|((?<=[OGNR]\s)[0-9]{1,5})|((?<=\[.{15}\]\s).{1,40}(?=\s(:\s)|\s))/\e[1;32m$1\e[0m\e[1;36m$2\e[0m\e[1;33m$3\e[0m\e[1;31m$4\e[0m\e[1;34m$5\e[0m\e[1;35m$6\e[0m\e[1;36m$7\e[0m/g'

列印出來的效果

image-20220423103023248

再進一步操作

微服務時代,專案肯定是不會只有一個jar的,就拿本人自己寫的專案來看(也是因為沒有采用容器化部署,感覺搞不好,坑太多了),目前也是6個包了,儘管上述操作也還簡單方便,只需要進到每個模組裡面,執行deploy.sh即可

不過本著精益求精的思想理念,到底有沒有更加好方法,可以一勞永逸的,即使之後加服務,不需要修改太多東西的操作

基於此,在模組平級裡,新建一個common-shell的資料夾,裡面放一個deploy_all.sh

deploy_all.sh程式碼
#! /bin/bash
## author:Amg
## 該shell指令碼用於一鍵啟動、停止、重啟所有設定好的jar檔案

cd ..
base_path=`pwd`
# 即使加服務,只要符合約定就可以被掃描出來
centers=`ls -al | grep dtx | awk '{print $9}'`
echo "---------------------base path: ${base_path} ------------------------"

## 啟動所有專案
start(){
 
 for line in $centers
 do
   jarPath=${base_path}/$line/bin/
   echo "當前所在目錄: ${jarPath},即將啟動目錄下的jar "
   cd ${jarPath}
   sh deploy.sh start
   echo "================================"
 done
}

## 停止所有專案
stop(){


 for line in $centers
 do
   jarPath=${base_path}/$line/bin/
   echo "當前所在目錄: ${jarPath},即將停止目錄下的jar "
   cd ${jarPath}
   sh deploy.sh stop
   echo "================================"
 done
}


## 重啟所有專案
restart(){


 for line in $centers
 do
   jarPath=${base_path}/$line/bin/
   echo "當前所在目錄: ${jarPath},即將重啟目錄下的jar "
   cd ${jarPath}
   sh deploy.sh restart
   echo "================================"
 done
}

##檢查專案狀態
status(){

 for line in $centers
 do
   jarPath=${base_path}/$line/bin/
   echo "當前所在目錄: ${jarPath},即將檢查目錄下的jar執行情況"
   cd ${jarPath}
   sh deploy.sh status
   echo "================================"
 done

}

usage(){
 echo "該指令碼用於一鍵啟停,具體用法有start、stop、restart status"
}
#根據輸入引數,選擇執行對應方法,不輸入則執行使用說明
case "$1" in
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "status")
    status
    ;;
  "restart")
    restart
    ;;
  *)
    usage
    ;;
esac

image-20220423104246283

該指令碼的作用其實很簡單,就是不斷的迴圈進入到各個具體的模組,呼叫上面的deploy指令碼,進行一系列的操作

基於約定大於配置的思想,如果我們後續加服務,只需要在平級下面建立相同規則的資料夾,裡面的結構也是存放lib,logs,bin即可

相關文章