各位,早上好啊~ 發現許久沒有分享過技術文章了,今天分享兩個部署專案時候比較實用的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
重啟效果如下
彩色日誌操作
也是由於個人習慣,回把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'
列印出來的效果
再進一步操作
微服務時代,專案肯定是不會只有一個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
該指令碼的作用其實很簡單,就是不斷的迴圈進入到各個具體的模組,呼叫上面的deploy指令碼,進行一系列的操作
基於約定大於配置的思想,如果我們後續加服務,只需要在平級下面建立相同規則的資料夾,裡面的結構也是存放lib,logs,bin即可