每次啟動(dòng)Java程序jar包的時(shí)候,難道你還在手敲java -jar xxserver.jar……?邊敲邊想著都需要追加哪些參數(shù)? 今天就推薦給大家一個(gè)幾乎通用的Shell腳本,它支持Java程序Jar包的服務(wù)啟動(dòng)、服務(wù)停止、服務(wù)狀態(tài)查看,同時(shí)在腳本中追加了一些語(yǔ)法說(shuō)明,具體Shell命令,還請(qǐng)大家自行上網(wǎng)學(xué)習(xí)。 #!/bin/sh
# 該腳本為L(zhǎng)inux下啟動(dòng)java程序的腳本
#
# author: luandy
# date: 2021/1/15
#
# 特別注意:
# 該腳本使用系統(tǒng)kill命令來(lái)強(qiáng)制終止指定的java程序進(jìn)程。
# 所以在殺死進(jìn)程前,可能會(huì)造成數(shù)據(jù)丟失或數(shù)據(jù)不完整。如果必須要考慮到這類情況,則需要改寫此腳本,
#
#
# 根據(jù)實(shí)際情況來(lái)修改以下配置信息 ##################################
# JAVA應(yīng)用程序的名稱
APP_NAME=uid-consumer
# JAVA應(yīng)用程序端口號(hào)
SERVER_PORT=9999
# jar包存放路徑
JAR_PATH='/app/uid-consumer'
# jar包名稱
JAR_NAME=uid-consumer-1.1.0-SNAPSHOT.jar
# PID 代表是PID文件
JAR_PID=$JAR_NAME\.pid
# 日志輸出文件
LOG_FILE=logs
# java虛擬機(jī)啟動(dòng)參數(shù)
JAVA_OPTS="-Xms512m -Xmx512m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:ParallelGCThreads=4 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=utf-8"
# 根據(jù)實(shí)際情況來(lái)修改以上配置信息 ##################################
# 檢查程序是否處于運(yùn)行狀態(tài)
is_exist() {
# 查詢出應(yīng)用服務(wù)的進(jìn)程id,grep -v 是反向查詢的意思,查找除了grep操作的run.jar的進(jìn)程之外的所有進(jìn)程
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
# [ ]表示條件測(cè)試。注意這里的空格很重要。要注意在'['后面和']'前面都必須要有空格
# [ -z STRING ] 如果STRING的長(zhǎng)度為零則返回為真,即空是真
# 如果不存在返回0,存在返回1
if [ -z "${pid}" ]; then
return 0
else
return 1
fi
}
# ######### Shell腳本中$0、$?、$!、$$、$*、$#、$@等的說(shuō)明 #########
# $$ Shell本身的PID(ProcessID,即腳本運(yùn)行的當(dāng)前 進(jìn)程ID號(hào))
# $! Shell最后運(yùn)行的后臺(tái)Process的PID(后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的 進(jìn)程ID號(hào))
# $? 最后運(yùn)行的命令的結(jié)束代碼(返回值)即執(zhí)行上一個(gè)指令的返回值 (顯示最后命令的退出狀態(tài)。0表示沒(méi)有錯(cuò)誤,其他任何值表明有錯(cuò)誤)
# $- 顯示shell使用的當(dāng)前選項(xiàng),與set命令功能相同
# $* 所有參數(shù)列表。如"$*"用「"」括起來(lái)的情況、以"$1 $2 … $n"的形式輸出所有參數(shù),此選項(xiàng)參數(shù)可超過(guò)9個(gè)。
# $@ 所有參數(shù)列表。如"$@"用「"」括起來(lái)的情況、以"$1" "$2" … "$n" 的形式輸出所有參數(shù)。
# $# 添加到Shell的參數(shù)個(gè)數(shù)
# $0 Shell本身的文件名
# $1~$n 添加到Shell的各參數(shù)值。$1是第1參數(shù)、$2是第2參數(shù)…。
# 服務(wù)啟動(dòng)方法
start() {
is_exist
if [ $? -eq "1" ]; then
echo "$APP_NAME is already running pid is ${pid}"
else
# jar服務(wù)啟動(dòng)腳本
nohup java $JAVA_OPTS -Xloggc:$LOG_FILE/gc/gclog.log -XX:HeapDumpPath=$LOG_FILE/gc/HeapDump.hprof -jar $JAR_PATH/$JAR_NAME >./$LOG_FILE/run.log 2>&1 &
echo $! > $JAR_PID
echo "start $APP_NAME successed pid is $! "
tail -1000f $LOG_FILE/run.log
fi
}
# 服務(wù)停止方法
stop() {
# is_exist
pidf=$(cat $JAR_PID)
# echo "$pidf"
echo "pid = $pidf begin kill $pidf"
kill $pidf
rm -rf $JAR_PID
sleep 2
# 判斷服務(wù)進(jìn)程是否存在
is_exist
if [ $? -eq "1" ]; then
echo "pid = $pid begin kill -9 $pid"
kill -9 $pid
sleep 2
echo "$APP_NAME process stopped!"
else
echo "$APP_NAME is not running!"
fi
}
# 服務(wù)運(yùn)行狀態(tài)查看方法
status() {
is_exist
if [ $? -eq "1" ]; then
echo "$APP_NAME is running,pid is ${pid}"
else
echo "$APP_NAME is not running!"
fi
}
# 重啟服務(wù)方法
restart() {
# 調(diào)用服務(wù)停止命令
stop
# 調(diào)用服務(wù)啟動(dòng)命令
start
}
# 幫助說(shuō)明,用于提示輸入?yún)?shù)信息
usage() {
echo "Usage: sh run-service.sh [ start | stop | restart | status ]"
exit 1
}
###################################
# 讀取腳本的第一個(gè)參數(shù)($1),進(jìn)行判斷
# 參數(shù)取值范圍:{ start | stop | restart | status }
# 如參數(shù)不在指定范圍之內(nèi),則打印幫助信息
###################################
#根據(jù)輸入?yún)?shù),選擇執(zhí)行對(duì)應(yīng)方法,不輸入則執(zhí)行使用說(shuō)明
case "$1" in
'start')
start
;;
'stop')
stop
;;
'restart')
restart
;;
'status')
status
;;
*)
usage
;;
esac
exit 0
趕緊收藏,還等什么,復(fù)制粘貼到 run-service.sh 文件中,馬上使用吧!
|