首先我們這裏有一臺跳板機,然後有一臺伺服器,現在的要做的就是將跳板機上的jar包檔案,然後通過伺服器上的指令碼實現舊jar包的備份,新jar包的啓動。
使用起來很簡單:begin.sh bda-admin-V2.xx.jar
實現部署的操作:拷貝jar包到伺服器 -> 備份舊服務jar包 -> 啓動新服務jar包
以下程式碼就是跳板機上的程式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
解釋一下,上面這段程式分三個部分:
通過上面的跳板機上的程式碼,我們知道跳板機最終會呼叫伺服器上/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
我解釋一下上面其實一共做了以下幾個工作:
上面都提到的新的啓動服務在/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包的指令碼
startup-bda-admin.sh
必須單獨起一個檔案,踩了很久的坑,如果不單獨寫一個檔案,伺服器上執行不會有問題,但是遠端執行就是起不起來服務。