部署springboot項目的shell腳本

以前部署項目都是通過ps -ef | grep java查找項目的進程號。找到進程號之後通過指令(kill -9 進程號)殺死進程。最後通過(nohup java -jar rex-api-0.0.1-SNAPSHOT.jar >out.log 2>&1 &)指令啓動項目。這種方式手動查找進程號再kill掉,再重啓項目這樣太耗時間了。
今天看到一個shell腳本感覺挺好用的就記錄一下


#!/bin/sh

APP_NAME=rex-api

tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Stop Process...'
    kill -15 $tpid
fi
sleep 2
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'kill -9 Process...'
    kill -9 $tpid
else
    echo 'Stop kill -15 Success!'
fi

nohup java -Xms6000M -Xmx6000M -Xmn2125M  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/springboot/rex-api/OutOfMemory.dump -jar rex-api-0.0.1-SNAPSHOT.jar >out.log 2>&1 &

echo 'Restart Success!'

指令ps -ef | grep rex-api輸出結果如下
在這裏插入圖片描述
Linux所提供的管道符“|”將兩個命令隔開,管道符左邊命令的輸出就會作爲管道符右邊命令的輸入

awk指令的用法
[root@localhost awk]# echo “aa bb cc dd ee ff” | awk ‘{print $1}’
aa

kill -15 pid
大部分程序執行kill -15 pid指令後,會先釋放自己的資源,然後再停止。但是也有程序可以在接受到信號量後,做一些其他的事情,並且這些事情是可以

配置的。如果程序正在等待IO,可能就不會立馬做出相應。也就是說執行kill -15 pid指令後多半是會被阻塞的、忽略的。

kill -9 pid
多半程序執行後會終止進程,少數進程無法立即響應

APP_NAME是shell的變量,他的值是項目打包成jar後的名字的前面部分。tpid也是shell變量,最終賦值爲項目進程的pid。指令ps -ef|grep $APP_NAME會獲取到兩個進程信息,一個是rex-api項目的進程信息另一個是grep指令的進程信息。指令grep -v grep是在上一指令的結果集中過濾掉grep指令進程信息。所以到這一步只有項目的進程信息了。指令grep -v kill是在上一次結果的進程信息中獲取非kill指令進程的進程信息。這條指令其實可以不要的,只是嚴謹點。指令awk '{print $2}'是把項目進程信息的以文本的形式並且獲取第二列文本的信息,其實獲取的就是項目的進程pid。最終獲取到的項目進程pid賦值給tpid變量

if [ ${tpid} ]; then 這行判斷tpid變量是否有值,有值則執行 if 裏面的命令終止進程。後面的指令都是一樣的就不再描述了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章