每次啟動Java程序jar包的時候,難道你還在手敲java -jar .jar……?邊敲邊想著都需要追加哪些參數?
今天就推薦給大家一個幾乎通用的Shell腳本,它支持Java程序Jar包的服務啟動、服務停止、服務狀態查看停止運行此腳本嗎是什么意思停止運行此腳本嗎是什么意思,同時在腳本中追加了一些語法說明,具體Shell命令,還請大家自行上網學習。
#!/bin/sh
# 該腳本為Linux下啟動java程序的腳本
#
# author: luandy
# date: 2021/1/15
#
# 特別注意:
# 該腳本使用系統kill命令來強制終止指定的java程序進程。
# 所以在殺死進程前,可能會造成數據丟失或數據不完整。如果必須要考慮到這類情況,則需要改寫此腳本,
#
#
# 根據實際情況來修改以下配置信息 ##################################
# JAVA應用程序的名稱
APP_NAME=uid-consumer
# JAVA應用程序端口號
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虛擬機啟動參數
JAVA_OPTS="-Xms512m -Xmx512m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:ParallelGCThreads=4 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=utf-8"
# 根據實際情況來修改以上配置信息 ##################################
# 檢查程序是否處于運行狀態
is_exist() {
# 查詢出應用服務的進程id,grep -v 是反向查詢的意思,查找除了grep操作的run.jar的進程之外的所有進程
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
# [ ]表示條件測試。注意這里的空格很重要。要注意在'['后面和']'前面都必須要有空格
# [ -z STRING ] 如果STRING的長度為零則返回為真,即空是真
# 如果不存在返回0,存在返回1
if [ -z "${pid}" ]; then
return 0
else
return 1
fi
}
# ######### Shell腳本中$0、$?、$!、$$、$*、$#、$@等的說明 #########
# $$ Shell本身的PID(ProcessID,即腳本運行的當前 進程ID號)
# $! Shell最后運行的后臺Process的PID(后臺運行的最后一個進程的 進程ID號)
# $? 最后運行的命令的結束代碼(返回值)即執行上一個指令的返回值 (顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤)
# $- 顯示shell使用的當前選項,與set命令功能相同
# $* 所有參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數,此選項參數可超過9個。
# $@ 所有參數列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。
# $# 添加到Shell的參數個數
# $0 Shell本身的文件名
# $1~$n 添加到Shell的各參數值。$1是第1參數、$2是第2參數…。
# 服務啟動方法
start() {
is_exist
if [ $? -eq "1" ]; then
echo "$APP_NAME is already running pid is ${pid}"
else
# jar服務啟動腳本
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
}
# 服務停止方法
stop() {
# is_exist
pidf=$(cat $JAR_PID)
# echo "$pidf"
echo "pid = $pidf begin kill $pidf"
kill $pidf
rm -rf $JAR_PID
sleep 2
# 判斷服務進程是否存在
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
}
# 服務運行狀態查看方法
status() {
is_exist
if [ $? -eq "1" ]; then
echo "$APP_NAME is running,pid is ${pid}"
else
echo "$APP_NAME is not running!"
fi
}
# 重啟服務方法
restart() {
# 調用服務停止命令
stop
# 調用服務啟動命令
start
}
# 幫助說明,用于提示輸入參數信息
usage() {
echo "Usage: sh run-service.sh [ start | stop | restart | status ]"
exit 1
}
###################################
# 讀取腳本的第一個參數($1),進行判斷
# 參數取值范圍:{ start | stop | restart | status }
# 如參數不在指定范圍之內,則打印幫助信息
###################################
#根據輸入參數,選擇執行對應方法,不輸入則執行使用說明
case "$1" in
'start')
start
;;
'stop')
stop
;;
'restart')
restart
;;
'status')
status
;;
*)
usage
;;
esac
exit 0