使用shell指令碼完成自動化部署jar包

2020-08-07 21:55:20

1.前言

首先我們這裏有一臺跳板機,然後有一臺伺服器,現在的要做的就是將跳板機上的jar包檔案,然後通過伺服器上的指令碼實現舊jar包的備份,新jar包的啓動。
使用起來很簡單:begin.sh bda-admin-V2.xx.jar
實現部署的操作:拷貝jar包到伺服器 -> 備份舊服務jar包 -> 啓動新服務jar包

2.跳板機

以下程式碼就是跳板機上的程式begin.sh

#!/bin/sh
fileName=$1
if [ -z "$fileName" ]; then
echo "檔名不能爲空"
exit 0
fi

echo "開始拷貝jar檔案【$fileName】到datanode4"
scp $fileName  deployer@datanode4:/home/deployer/devel/javaprograms/

echo "檔案傳輸結束"
ssh deployer@datanode4  /home/deployer/devel/javaprograms/bda-web-xxx.sh $fileName

解釋一下,上面這段程式分三個部分:

  1. 判斷輸入的jar包名是不是空的,是空的就結束
  2. 將jar包拷貝到我們的datanode4伺服器上
  3. 執行datanode4伺服器上相應的啓動指令碼

3.伺服器

通過上面的跳板機上的程式碼,我們知道跳板機最終會呼叫伺服器上/home/deployer/devel/javaprograms/bda-web-xxx.sh這個shell指令碼命令。這個命令的程式碼如下;

#!/bin/bash
echo "datanode4開始部署bda-web"

#開啓檔案所屬的目錄,不然遠端執行會找不到當前目錄
cd /home/deployer/devel/javaprograms;

#cd /usr/local/test
#新的jar包會當成參數傳過來
newJar=$1

echo "新的jar爲:$newJar"

#如果新的jar包爲空則退出
if [ -z "$newJar" ]; then
	echo "新的jar不能爲空"
	exit 0
fi

#獲取舊的jar包名稱,當然可能是空的,也可能跟當前名稱一致
oldJar=$(ps -ef | grep bda-admin|grep -v 'bda-web-xxx.sh'|grep -v grep|awk '{print $10}'|cut -d '/' -f 2)

echo "當前執行的舊的jar包爲:$oldJar"

#如果新的jar包爲空則退出
if [ -z "$oldJar" ]; then
	echo "沒有啓動的bda-admin服務"
else
	#如果舊的進程還在就將舊的進程殺掉
	oldId=`ps -ef|grep bda-admin|grep -v "$0"|grep -v "grep"|awk '{print $2}'`
	echo "$oldId"
	echo "kill old process start ..."
	for id in $oldId
	do
		kill -9 $id
		echo "killed $id"
	done
	echo "kill old process end"

	#獲取當前時間
	suffix=".bak-"`date '+%Y-%m-%d'`;
	echo $suffix;
	#將舊的jar包進行備份
	mv $oldJar $oldJar${suffix}
fi

#上面的步驟是殺掉舊的進程,下面 下麪開始啓動新的進程
sh /home/deployer/devel/javaprograms/startup-bda-admin.sh $newJar
echo "服務啓動檢視進程:"
echo `ps -ef | grep bda-admin|grep -v 'bda-web-xxx.sh'|grep -v grep

我解釋一下上面其實一共做了以下幾個工作:

  1. 開啓當前目錄,如果遠端執行,這個步驟必須有
  2. 獲取當前正在執行的服務jar包名稱
  3. 如果步驟2沒有獲取到jar包名稱,代表沒有執行的服務直接跳到步驟6
  4. 如果步驟2獲取到了jar包名稱則獲取這個進程的id
  5. 殺掉正在執行的進程,並將舊的jar服務備份
  6. 啓動新的服務jar包,新的服務jar就是從跳板機傳過來的那個
  7. 查詢服務是否已啓動

上面都提到的新的啓動服務在/home/deployer/devel/javaprograms/startup-bda-admin.sh這個檔案裡,這個檔案的內容如下;

#!/bin/bash
echo "開始啓動·"
nohup /home/deployer/local/jdk/bin/java -jar ${1} > ${1}.log 2>&1 &

這個就是通過java命令啓動jar包的指令碼

4.注意事項

  1. 使用ps命令查詢的時候要把當前的shell命令也排除,不然會產生幹擾
  2. 啓動服務的命令startup-bda-admin.sh必須單獨起一個檔案,踩了很久的坑,如果不單獨寫一個檔案,伺服器上執行不會有問題,但是遠端執行就是起不起來服務。
  3. 啓動java程式的java命令需要是全路徑,理由同上。