Linux(CentOS7)使用腳本啟動(dòng)java jar/war包
本文以jar包為例(war包是同樣的操作流程)。
開(kāi)始之前,先準(zhǔn)備一個(gè)jar包
以springboot工程為例。
我打包用的maven。
在pom文件中可以約束最終的jar包名稱:
mvn clear 再然后 mvn install 這些都沒(méi)什么好說(shuō)的。
建議以下文件全部放在一個(gè)目錄下
1、部署jar包
通過(guò)xftp或別的方式,將jar包放入服務(wù)器某個(gè)目錄:
2、準(zhǔn)備application.yml(springboot工程,如果是別的框架請(qǐng)略過(guò)此節(jié))
yml文件放入jar包的同一個(gè)目錄,內(nèi)容是常規(guī)的springboot-yml文件內(nèi)容,注意yml格式:
一會(huì)兒?jiǎn)?dòng)的時(shí)候會(huì)以服務(wù)器這個(gè)yml文件配置的內(nèi)容為準(zhǔn)??????
而不是項(xiàng)目中的yml文件??????
3、準(zhǔn)備jvm_opt文件(.file文件)
此文件內(nèi)容為java虛擬機(jī)啟動(dòng)時(shí)的參數(shù):
配置jvm內(nèi)存:一般只改abc這三個(gè)地方:
a = b 并且 c = a*(2/3)
單位:g 或者 m
如果你怕這么配置有啥問(wèn)題,你可以臨時(shí)惡補(bǔ)一下java虛擬機(jī)的知識(shí),反正我這兒好幾個(gè)工具jar包這么配沒(méi)啥問(wèn)題。VM_OPTIONS="-Xms512m -Xmx512m -Xss256K -Xmn384m -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:-UseLargePages -XX:-UseBiasedLocking"
-Xss根據(jù)你的接口或者定時(shí)任務(wù)的每次調(diào)度的數(shù)據(jù)大小,可以適當(dāng)增大一些。
4、準(zhǔn)備腳本
我這兒命名為boot.sh
先上腳本,文章后面會(huì)介紹:怎么用?腳本內(nèi)容的含義?
#!/bin/bash
APP_NAME=$1
YUM_FILE_PATH=$2
[ -r jvm_opt ] && source jvm_opt ##檢查配置文件存在且可讀,則將其souce
VM_OPT=${VM_OPTIONS:-Xms1g -Xmx1g -Xss256K -Xmn600m -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:-UseLargePages -XX:-UseBiasedLocking}
# 提示輸入?yún)?shù)
usage() {
echo app_name=$APP_NAME vm_opt=$VM_OPT yum=$YUM_FILE_PATH
echo "Usage: ./boot.sh [APP_NAME] [YML_NAME] [start|stop|restart|status]"
exit 1
}
# 檢查程序是否在運(yùn)行
is_exist(){
# 獲取PID
PID=$(ps -ef |grep ${APP_NAME} | grep -v $0 |grep -v grep |awk '{print $2}')
# -z "${pid}"判斷pid是否存在,如果不存在返回1,存在返回0
if [[ -z "${PID}" ]]; then
# 如果進(jìn)程不存在返回1
echo "進(jìn)程不存在"
return 1
else
# 進(jìn)程存在返回0
echo "進(jìn)程存在"
return 0
fi
}
# 啟動(dòng)方法
start(){
is_exist
if [[ $? -eq "0" ]]; then
echo "${APP_NAME} is already running, PID=${pid}"
else
nohup java -jar $VM_OPT -Dspring.config.location=$YUM_FILE_PATH $APP_NAME >log 2>&1 &
PID=$(echo $!)
echo "${APP_NAME} start success, PID=$! YUM_FILE_PATH=${YUM_FILE_PATH}"
fi
}
# 停止方法
stop(){
is_exist
if [[ $? -eq "0" ]]; then
kill -9 ${PID}
echo "${APP_NAME} process stop, PID=${PID}"
else
echo "There is not the process of ${APP_NAME}"
fi
}
# 重啟進(jìn)程函數(shù)
restart(){
stop
echo "${APP_NAME} 準(zhǔn)備重啟..."
sleep 5
start
}
# 查看進(jìn)程狀態(tài)
status(){
is_exist
if [[ $? -eq "0" ]]; then
echo "${APP_NAME} is running, PID=${PID}"
else
echo "There is not the process of ${APP_NAME}"
fi
}
case $3 in
"start")
start
;;
"stop")
stop
;;
"restart")
restart
;;
"status")
status
;;
*)
usage
;;
esac
exit 0
使用腳本
1、先來(lái)到你這幾個(gè)文件的目錄
cd /opt/tools/es-tasks
2、給腳本boot.sh賦予可執(zhí)行權(quán)限:
chmod 777 boot.sh
777是什么意思?
linux中權(quán)限是用二進(jìn)制表示的。
先看一個(gè)控制臺(tái)的例子:
看看這一列,第一個(gè)位置的 - 或者 d 這種文件描述符咱們先不用看,先從第二個(gè)位置的r開(kāi)始看:
一共有9個(gè)位置 rwxrwxrwx 共三組 rwx,分別對(duì)應(yīng)了 三個(gè)角色(擁有者、群組、其他人) 對(duì)這個(gè)文件或文件目錄的權(quán)限。
“r - -” 就是只有【讀】權(quán)限,對(duì)應(yīng)二進(jìn)制的 100
“- w -” 就是只有【寫】權(quán)限,對(duì)應(yīng)二進(jìn)制的 010
“- -x” 就是只有【執(zhí)行】權(quán)限,對(duì)應(yīng)二進(jìn)制的 001
分別翻譯成十進(jìn)制,“r - -” 就是400,"- w -“就是020,”- - x"就是001
那么:如果是"rw-“就是有【讀、寫】權(quán)限,沒(méi)有【執(zhí)行】權(quán)限,對(duì)應(yīng)的就是420
如果是"r-x"就是有【讀、執(zhí)行】權(quán)限,沒(méi)有【寫】權(quán)限,就是401
如果是”-wx"就是有【寫、執(zhí)行】權(quán)限,沒(méi)有【讀】權(quán)限,對(duì)應(yīng)的就是021(這種設(shè)計(jì)一般不存在,都能改能執(zhí)行了,就不能讀嗎),這里只是說(shuō)明權(quán)限邏輯舉例需要。所以 “rwx” 就是421,而4+2+1=7(777就是從這來(lái)的),那么 “chmod 777 file” 這個(gè)指令的含義就是:將此文件的【讀、寫、執(zhí)行】權(quán)限賦予給【擁有者、群組、其他人】這些角色。
當(dāng)然:
1、如果你只想將此文件的【讀、寫、執(zhí)行】權(quán)限賦予給【自己】或【自己的群組】,只需要 “chmod 700 file” 或者 “chmod 770 file” 就行。
2、 如果你只想將此文件的【讀、寫】權(quán)限賦予給自己或自己的群組,只需要"chmod 600 file"或者"chmod 660 file"就行了。
3、如果你想讓【自己和自己組】擁有【讀、寫、執(zhí)行】權(quán)限,而【其他人】只能【讀】,只需要"chmod 774 file"。所謂 linux權(quán)限,就這么簡(jiǎn)單。至于用戶和用戶組,也很簡(jiǎn)單,閣下可自行查閱其他資料學(xué)習(xí),我就不贅述了。
請(qǐng)跟隨我回到主題(這篇文章講啥來(lái)著?看看標(biāo)題,咱們繼續(xù))
3、執(zhí)行命令
啟動(dòng)
./boot.sh xxx.jar application.yml start
停止
./boot.sh xxx.jar application.yml stop
重啟
./boot.sh xxx.jar application.yml restart
查看是否在運(yùn)行
./boot.sh xxx.jar application.yml status
腳本說(shuō)明(老鳥(niǎo)可以略過(guò)這一節(jié))
1、第一句
#!/bin/bash
寫在 .sh 腳本文件最開(kāi)頭第一行。
這個(gè)是必須要寫的,linux系統(tǒng)不同的話,寫法上可能會(huì)有一丟丟區(qū)別,我這里是CentOS7。
2、第二句
APP_NAME=$1
YUM_FILE_PATH=$2
聲明了兩個(gè)變量,指向 $1 和 $2。
$1 對(duì)應(yīng)的是咱們啟動(dòng)命令的:
./boot.sh xxx.jar application.yml start/stop/restart/status
其中的xxx.jar這一部分。
bash解釋器是按照空格進(jìn)行命令的切割,而 xxx.jar 在第【1】位置,所以是$1 (第【0】位置是 ./boot)。
$2同理。
這兩句話的意思就是,聲明這倆變量,并且讓APP_NAME=xxx.jar,讓YUM_FILE_PATH=application.yml
3、第三句和第四句
[ -r jvm_opt ] && source jvm_opt
檢查這個(gè)jvm_opt文件,如果存在并且可讀,就把它的內(nèi)容加載進(jìn)來(lái)。
VM_OPT=${VM_OPTIONS:-Xms1g -Xmx1g -Xss256K -Xmn600m -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:-UseLargePages -XX:-UseBiasedLocking}
聲明一個(gè)VM_OPT變量,讓它等于后面這個(gè)${VM_OPTIONS : …},這里面的VM_OPTIONS就是從jvm_opt文件中取出來(lái)的變量。
意思是:如果取到了,就讓VM_OPT=VM_OPTIONS,如果沒(méi)取到,就讓VM_OPT等于冒號(hào)后面的這一長(zhǎng)串值。
4、接下來(lái)就是六個(gè)自定義方法(也叫函數(shù))
第一個(gè)方法,用于提示
usage() {
echo app_name=$APP_NAME vm_opt=$VM_OPT yum=$YUM_FILE_PATH
echo "Usage: ./boot.sh [APP_NAME] [YML_NAME] [start|stop|restart|status]"
exit 1
}
此方法在腳本被非正常執(zhí)行時(shí)觸發(fā),比如說(shuō)你./boot.sh start就想執(zhí)行,xxx.jar也不寫
那它就提示你 “Usage: ./boot.sh [APP_NAME] [YML_NAME] [start|stop|restart|status]” 一個(gè)正常命令格式是什么。
第二個(gè)方法,用于判斷是否已經(jīng)在運(yùn)行
is_exist(){
# 獲取PID
PID=$(ps -ef |grep ${APP_NAME} | grep -v $0 |grep -v grep |awk '{print $2}')
# -z "${pid}"判斷pid是否存在,如果不存在返回1,存在返回0
if [[ -z "${PID}" ]]; then
# 如果進(jìn)程不存在返回1
echo "進(jìn)程不存在"
return 1
else
# 進(jìn)程存在返回0
echo "進(jìn)程存在"
return 0
fi
}
第三個(gè)方法,用于啟動(dòng)jar包
start(){
is_exist
if [[ $? -eq "0" ]]; then
echo "${APP_NAME} is already running, PID=${pid}"
else
nohup java -jar $VM_OPT -Dspring.config.location=$YUM_FILE_PATH $APP_NAME >log 2>&1 &
PID=$(echo $!)
echo "${APP_NAME} start success, PID=$! YUM_FILE_PATH=${YUM_FILE_PATH}"
fi
}
其中,"is_exist"是調(diào)用了上面講的第二個(gè)方法。
然后拿著 is_exist() 方法運(yùn)行的結(jié)果(0或者1)來(lái)決定要不要啟動(dòng)。
這一段腳本總體意思也很簡(jiǎn)單,判斷進(jìn)程是否已經(jīng)存在,如果存在就提示;不存在就靜默啟動(dòng),啟動(dòng)完了提示success。
其中:
nohup java -jar $VM_OPT -Dspring.config.location=$YUM_FILE_PATH $APP_NAME >log 2>&1 &
這一段就是在啟動(dòng)了。 “>” 代表輸出,log代表同級(jí)目錄下的日志文件log.file,如果啟動(dòng)后log文件不存在則會(huì)自動(dòng)創(chuàng)建。
">log"意思是把程序的輸出內(nèi)容寫到log這個(gè)文件中去。
順便提一嘴奧
一個(gè) > 號(hào) “>”
會(huì)把之前的覆蓋掉,也就是說(shuō),每次重啟jar包,之前l(fā)og中的內(nèi)容就沒(méi)了。
好處也很明顯,不會(huì)造成文件膨脹,排查本次啟動(dòng)后問(wèn)題時(shí)也會(huì)很方便。兩個(gè) > 號(hào) “>>”
在之前的文件內(nèi)容的基礎(chǔ)上,不斷追加新的內(nèi)容。我springboot工程一般都用到日志框架,這些框架會(huì)把日志,按日期寫入某個(gè)文件夾內(nèi)的一個(gè)個(gè)文件中去,所以我一般腳本這個(gè)位置寫 一個(gè)">“符號(hào),也就是”>log"
繼續(xù)看這段腳本:
nohup java -jar $VM_OPT -Dspring.config.location=$YUM_FILE_PATH $APP_NAME >log 2>&1 &
“2>&1” 意思是 把程序的 標(biāo)準(zhǔn)錯(cuò)誤輸出 也重定向到 標(biāo)準(zhǔn)輸出。
在linux中,標(biāo)準(zhǔn)輸入用0表示,標(biāo)準(zhǔn)輸出用1表示,標(biāo)準(zhǔn)錯(cuò)誤輸出用2表示。
最后一個(gè) “&” 代表靜默啟動(dòng),“別占用我控制臺(tái)一直打印” 就這個(gè)意思。
第四個(gè)方法,用于停止jar包
stop(){
is_exist
if [[ $? -eq "0" ]]; then
kill -9 ${PID}
echo "${APP_NAME} process stop, PID=${PID}"
else
echo "There is not the process of ${APP_NAME}"
fi
}
非常好理解:進(jìn)程存在否?存在就殺掉進(jìn)程然后提示;不存在就直接提示。
第五個(gè)方法,用于重啟jar包
restart(){
stop
echo "${APP_NAME} 準(zhǔn)備重啟..."
sleep 5
start
}
也很好理解:先停止,睡5秒,再啟動(dòng)。
第六個(gè)方法,查看運(yùn)行狀態(tài)
status(){
is_exist
if [[ $? -eq "0" ]]; then
echo "${APP_NAME} is running, PID=${PID}"
else
echo "There is not the process of ${APP_NAME}"
fi
}
這個(gè)就不用說(shuō)了,只是調(diào)用了一下 is_exist() 方法然后根據(jù)0或1的返回,給我們提示運(yùn)行狀態(tài)而已。
腳本的最后一段
case $3 in
"start")
start
;;
"stop")
stop
;;
"restart")
restart
;;
"status")
status
;;
*)
usage
;;
esac
exit 0
前面講過(guò),$3就是咱們啟動(dòng)命令:
./boot.sh xxx.jar application start/stop/restart/status
其中的 start / stop / restart / status 這個(gè)部分。
腳本根據(jù)我們輸入的其中一個(gè)選項(xiàng),執(zhí)行不同的方法。
" *)usage ;; " 的意思是我們輸入的東西不在【start / stop / restart / status】這個(gè)范圍內(nèi),就會(huì)走 usage() 方法,也就是提示我們正常的格式。
“esac” 就是 “case” 反過(guò)來(lái)寫,是腳本中的一種語(yǔ)法,類似于【 " if " 與 " fi "】。
“exit 0” 意思是運(yùn)行正常退出腳本程序。
jar包運(yùn)行后的log日志怎么看?
我一般用這幾個(gè)命令
1、實(shí)時(shí)查看100行日志
tail -100f log
2、搜索日志中內(nèi)容
more log
然后敲 “/”
再然后輸入你要搜索的內(nèi)容,回車。
如果輸入錯(cuò)了,按 ctrl + backspace(退格) 往前刪。
寫在最后
簡(jiǎn)單好用,相當(dāng)于一個(gè)雛形,支持高度diy。
但是要小心,別在腳本中寫自己拿不準(zhǔn)的指令。
diy舉例
比如說(shuō)你就想用springboot工程resources下的那個(gè)yml配置,不愿意把它提取出來(lái),腳本改起來(lái)也很簡(jiǎn)單,只要找到 $, 把 $ 后面的數(shù)字改成你命令中對(duì)應(yīng)的位置就ok。
比如:
vi boot.sh
先刪掉 YUM_FILE_PATH=$2 這個(gè)變量(所有引用到這個(gè)變量的地方也給改改好奧)
把腳本最后的
case $3 in …
其中的$3
改成你 start/stop/restart/status 這個(gè)指令的位置
假如說(shuō)你指令是這么寫的:
./boot.sh xxx.jar start
那就把./boot.sh腳本中的所有 $3 改成 $2。
很明顯嘛,你變短了,數(shù)字也就變少了。
…
話說(shuō)回來(lái),稍微有點(diǎn)規(guī)模的項(xiàng)目一般也用不著這玩意,docker、k8s集群部署會(huì)更省心。
就有時(shí)候一些工具類的小玩意用一下還是蠻不錯(cuò)的。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-700888.html
ok,完活!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-700888.html
到了這里,關(guān)于Linux使用腳本啟動(dòng)jar/war包(springboot+maven工程jar包)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!