有時候我們會手動去啓動一個springbootjar包,但是如果我們想停止這個進程時只能ps去找到這個進程,然後手動的去kill掉,這時如果這個服務器上有很多進程,這樣就有可能會kill錯了進程,把別人或者其他重要的進程殺掉了,這樣就會造成不好的後果.所以我寫了個啓動和停止腳本.通過啓動腳本啓動後,會把進程的pid存到腳本執行目錄的pid文件中,當你要kill這個進程時,只要在這個目錄執行停止腳本的shell即可,它會從pid文件中取到pid,從而保證不會殺錯進程.
啓動腳本:
#! /bin/bash
serverName=$1 # 傳入的變量 要啓動的jar包名稱
remotePort=$2 # 若以debug方式啓動 需要傳入的端口號,否則可以不傳
if [ $serverName ]; then # 判斷是否爲空,不爲空,返回true
echo "serverName=${serverName}"
else
echo "請輸入jar包沒名稱"
exit;
fi
pid_file="pid" #啓動jar包後 pid存放的文件名稱,默認存在shell執行的同級目錄
cpid="-1" # 默認爲-1,表示不存在此文件
if [ -e $pid_file ]; then # 判斷文件是否存在,存在返回true
if [ -s $pid_file ]; then #判斷文件是否爲空(長度爲0) ,不爲空返回true
cpid=$(cat pid)
else
cpid="-2" #表示爲空文件
fi
fi
# echo "cpid=${cpid}"
threshold_pid=0 # pid 閾值,shell執行後獲取到的pid會與此比較 若文件不存在或文件爲空,獲取到的cpid都會小於此值,jar包會正常啓動.如果因爲人爲刪除或改變文件內容,可能會導致jar包重複啓動,而導致問題
if [ $cpid -gt $threshold_pid ]; then #表示正確獲取到了pid
oldServer=$(ps -ef|grep ${serverName} |awk {print\$2} |grep ${cpid})
fi
# echo "oldServer=${oldServer}"
if [ $oldServer ]; then
echo "程序已經啓動過了"
exit
fi
threshold_port=8180
if [[ $remotePort && $remotePort -gt $threshold_port ]]; then # 端口要在8180以上才以debug啓動
echo "debug方式啓動 port:${remotePort}"
nohup java -jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=${remotePort} ${serverName} &
else
echo "正常啓動"
nohup java -jar ${serverName} &
fi
echo "程序啓動的pid=$!寫入到了當前文件夾的${pid_file}中! "
echo -e "\033[31m 請勿手動刪除${pid_file}文件,否則可能會導致重複啓動 \033[0m"
echo "$!" > pid #將上一個後臺進程寫入到pid文件中
#./jdk1.8.0_172/bin/java -jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8195 east-content-0.0.1-SNAPSHOT.jar
停止腳本:
#! /bin/bash
cpid=$(cat pid)
echo "pid= ${cpid}"
kill -9 ${cpid}
ps -ef|grep content