以前部署項目都是通過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 裏面的命令終止進程。後面的指令都是一樣的就不再描述了