shell腳本學(xué)習(xí)之springboot jar包簡單部署
前言
很早就接觸了linux系統(tǒng)榜轿,然后也習(xí)慣了使用命令行悼沈。我也知道shell很強(qiáng)大泼返,這次就這springboot jar包簡單部署最仑,漲漲姿勢梦重。
簡單知識點(diǎn)
寫完的腳本文件仑乌,記得添加執(zhí)行權(quán)限: chmod +x xxxx.sh
執(zhí)行腳本命令: sh xxx.sh
-
要加很多空格百拓,變量和符號之前,如下晰甚,如果在 中括號‘0’ 和 ‘]’ 之間沒有空格衙传,那么該語句報(bào)錯(cuò),無法識別 0 這個(gè)參數(shù)
if [ $# -eq 0 ]; then usage fi
變量賦值時(shí)候 等號("=") 左右兩邊都不要留空格厕九,否則腳本報(bào)錯(cuò)
查看指定端口(80)運(yùn)行程序的進(jìn)程pid命令:
netstat -nlp|grep :80|awk '{print $7}'|sed 's/\([0-9]*\).*/\1/g
'注意sed 蓖捶、awk、grep 三個(gè)命令的區(qū)別和用法
-
if 語句中的一些參數(shù):
[-z string] “string”的長度為零則為真
[-n string] or [string] “string”的長度為非零non-zero則為真
其他的參數(shù)扁远,
read:命令行從輸入設(shè)備讀入內(nèi)容
推薦給使用的變量都添加花括號,這是個(gè)好習(xí)慣俊鱼,比如 echo "I am good at ${skill}"
-
一些特殊變量
變量 含義 $0
當(dāng)前腳本的文件名 $n
傳遞給腳本或函數(shù)的參數(shù)。n 是一個(gè)數(shù)字穿香,表示第幾個(gè)參數(shù)亭引。例如,第一個(gè)參數(shù)是 $1
皮获,第二個(gè)參數(shù)是$2
焙蚓。$#
傳遞給腳本或函數(shù)的參數(shù)個(gè)數(shù)。 $*
傳遞給腳本或函數(shù)的所有參數(shù)。 $@
傳遞給腳本或函數(shù)的所有參數(shù)购公。被雙引號(" ")包含時(shí)萌京,與 $*
稍有不同$?
上個(gè)命令的退出狀態(tài),或函數(shù)的返回值宏浩。 $$
當(dāng)前Shell進(jìn)程ID知残。對于 Shell 腳本,就是這些腳本所在的進(jìn)程ID比庄。
- shell默認(rèn)是不處理轉(zhuǎn)義的字符的求妹。需要加
-e
選項(xiàng)。比如 echo -e "hello \n world"(是在腳本中佳窑,不是在命令行中直接輸入) - shell本身不支持算數(shù)運(yùn)算制恍,所以使用
expr
命令進(jìn)行自增
#!/bin/bash
c=0;
while [ $c -lt 3 ]
do
echo "Value c is $c"
# 執(zhí)行命令,需要用 `` 包起來神凑。在 esc 鍵位邊山
c=`expr $c + 1`
done
Shell 函數(shù)必須先定義后使用
直接從終端調(diào)用函數(shù)净神,可以將函數(shù)定義在主目錄下的 .profile 文件,這樣每次登錄后溉委,在命令提示符后面輸入函數(shù)名字就可以立即調(diào)用
不希望文件內(nèi)容被覆蓋鹃唯,可以使用
>>
追加到文件末尾 eg:echo line 2 >> users
awk 中,
~
表示使用正則匹配瓣喊,!~
表示不匹配正則表達(dá)式坡慌;eg:awk '$2~/(1990|1991)/{print $1}' s.txt
linux 命令行文本工具
sed 命令
-
行內(nèi)部分內(nèi)容替換,這個(gè)用的最多了
sed 's/要被取代的字串/新的字串/g'
替換規(guī)則范例
s/\t/","/g; \t換成","
s/^/"/; 開頭加上"
s/$/"/;s/\n//g 末尾加上"
s/"http://g; 引號去掉
s/,/ /g 逗號換成空格
s/,/\n/g 逗號換成空行
s/[NULL]//g; NULL換成空白
s/[,型宝,]/\n/g 中英文逗號換成空行
掌握之后八匠,事半功倍
?
xargs 命令
由于很多命令不支持|
管道來傳遞參數(shù),而日常工作中有有這個(gè)必要趴酣,所以就有了xargs
命令梨树,例如:
find /sbin -perm +700 | ls -l #這個(gè)命令是錯(cuò)誤的
find /sbin -perm +700 | xargs ls -l #這樣才是正確的
cat picurl.csv | grep -E -o "http://www.test.com(.*?).jpg" | xargs wget -c
最后
學(xué)習(xí)過程中,參雜了其他知識岖寞,順手就記下來了抡四。
貼上最終腳本,很大部分參考他的博客
#!/bin/bash
usage() {
echo "食用方式:sh yourshellname.sh [jar包名] [start|stop|restart] [env]"
echo "jar包代號"
echo '1:dwcm-api 2:dwcm-web 3:dwcm-wx 4:dwcm-openApi 5:dwcm-coupon 6:dwcm-dispatcher'
echo "7:wes-api 8:wes-dispatcher 9:wes-manager wes-wx"
exit 1
}
## 判斷參數(shù)個(gè)是為 0 個(gè),$# 表示用戶輸入的參數(shù)個(gè)數(shù)
if [ $# -eq 0 ]; then
usage
fi
### 獲取所有的參數(shù)
PROJECT_NAME=""
EXCUTE_TYPE=""
PROJECT_ENV=""
CODE=0
echo "開始參數(shù)處理"
while getopts "n:a:m:" opt; do
case $opt in
n)
CODE=$OPTARG
;;
a)
EXCUTE_TYPE=$OPTARG
;;
m)
PROJECT_ENV=$OPTARG
;;
*)
echo "不支持參數(shù)和選項(xiàng)"
;;
esac
done
########### 包名處理
if [ $CODE == 1 ]; then
PROJECT_NAME='dwcm-api.jar'
elif [ $CODE == 2 ]; then
PROJECT_NAME="dwcm-web.jar"
elif [ $CODE == 3 ]; then
PROJECT_NAME="dwcm-wx.jar"
elif [ $CODE == 4 ]; then
PROJECT_NAME="dwcm-openApi.jar"
elif [ $CODE == 5 ]; then
PROJECT_NAME="dwcm-coupon.jar"
elif [ $CODE == 6 ]; then
PROJECT_NAME="dwcm-dispatcher.jar"
elif [ $CODE == 7 ]; then
PROJECT_NAME="wes-api.jar"
elif [ $CODE == 8 ]; then
PROJECT_NAME="wes-dispatcher.jar"
elif [ $CODE == 9 ]; then
PROJECT_NAME="wes-manager.jar"
elif [ $CODE == 10 ]; then
PROJECT_NAME="wes-wx.jar"
else
echo "請選擇對應(yīng)的程序執(zhí)行"
exit 1
fi
##### 執(zhí)行的操作類型
if [ ! $EXCUTE_TYPE ]; then
echo "執(zhí)行類型 [start|stop|restart] IS NULL"
exit 1
fi
if [ "$RPOJECT_ENV" = "" ]; then
echo "沒有指定運(yùn)行的profile仗谆,將使用打包時(shí)默認(rèn)的profile"
fi
echo "----------------------------------------------------"
echo "使用的參數(shù)"
echo "應(yīng)用jar包名:$PROJECT_NAME"
echo "腳本行為:$EXCUTE_TYPE"
echo "環(huán)境:$PROJECT_ENV"
echo "-------------------參數(shù)處理完成-------------------- "
### 以上參數(shù)接受區(qū)域 #######
echo "開始檢測進(jìn)程"
##### #查詢$PROCESS_PID進(jìn)程個(gè)數(shù):wc -l 返回行數(shù)
CURRENT_PROCESS_COUNT=$(ps -ef | grep $PROJECT_NAME | grep $PROJECT_NAME | grep -v "grep" | wc -l)
echo "當(dāng)前運(yùn)行 $PROJECT_NAME 的進(jìn)程個(gè)數(shù)為 $CURRENT_PROCESS_COUNT"
CURRENT_PROCESS_PID=$(ps -ef | grep $PROJECT_NAME | grep $PROJECT_NAME | grep -v "grep" | awk '{print $2}')
echo "當(dāng)前運(yùn)行 $PROJECT_NAME 的進(jìn)程ID-->"$CURRENT_PROCESS_PID
#### 啟動方法
start() {
echo '-----------------------開始啟動服務(wù)----------------------'
if [ -n "$CURRENT_PROCESS_PID" ]; then
echo "服務(wù)名稱: $PROJECT_NAME,進(jìn)程號為:$CURRENT_PROCESS_PID 服務(wù)正在運(yùn)行"
echo "本次執(zhí)行啟動失敗"
exit 1
fi
echo -n "開始啟動 $PROJECT_NAME"
nohup java -jar $PROJECT_NAME --spring.profiles.active=$PROJECT_ENV >/dev/null 2>&1 &
for st in $(seq 1 20); do
# 根據(jù)app名稱指巡,獲取 pid
PID=$(ps -ef | grep $PROJECT_NAME | grep $PROJECT_NAME | grep -v "grep" | awk '{print $2}')
# 計(jì)數(shù)到20,并且依然沒有獲取到app 的進(jìn)程隶垮,那此次啟動判定為失敗
if [ $st -eq 20 ] && [ -z "$PID"]; then
echo "服務(wù)啟動失敗"
break
fi
if [ -z "$PID"]; then
sleep 3
echo $st"服務(wù)啟動中....."
else
echo "服務(wù)啟動完成礼华,進(jìn)程ID為 $PID,耗時(shí): $(($((st - 1)) * 3)) 秒"
break
fi
done
}
stop() {
echo "開始執(zhí)行停止服務(wù)命令"
if [ -z "$CURRENT_PROCESS_PID" ]; then
echo "沒有找到該服務(wù)的進(jìn)程廊敌,請確認(rèn)該服務(wù)是否啟動"
else
kill -9 $CURRENT_PROCESS_PID
echo "服務(wù)器已停止"
fi
}
status() {
if [ -z "$CURRENT_PROCESS_PID" ]; then
echo "沒有找到該服務(wù)的進(jìn)程"
else
echo "運(yùn)行服務(wù)名稱:$PROJECT_NAME"
echo "運(yùn)行的進(jìn)程id; $CURRENT_PROCESS_PID"
fi
}
restart() {
stop
start
}
case "$EXCUTE_TYPE" in
"start")
echo "------------------start--------------------"
start
;;
"stop")
echo "------------------stop--------------------"
stop
;;
"restart")
restart
;;
"status")
echo "------------------status--------------------"
status
;;
*)
usage
;;
esac