#!/bin/bash
# 项目名字
APP_NAME=admin
# 环境配置文件,如application-dev.yml
PROFILE=pro
#老版本拼接jar包名,这里没用,可以字形删除
JAR_NAME=$APP_NAME\.jar
PID=$APP_NAME\.pid
#PROJ_HOME=$(pwd)
#项目路径,也是老版本直接复制过来的,这个可以根据自己情况修改
PROJ_HOME=/jars/
#export JRE_HOME=${JAVA_HOME}/jre
export JRE_HOME=/usr/local/java/jdk1.8.0_301/jre
# 这个是jar包的路径需要根据自己的情况配置
APP_HOME=$PROJ_HOME/
LOG_PATH=$APP_HOME/logs
# 创建log路径
if [ ! -d $LOG_PATH ]; then
mkdir $LOG_PATH
fi
#动态得到jar文件名 start
function getDir() {
for item in `ls $1`
do
fileName=$1"/"$item
if [ -d $fileName ]
then
echo $fileName"是目录"
#getDir $fileName
else
echo $fileName"不是目录"
echoFile $fileName
fi
done
}
function echoFile() {
fileName=$1
echo ${fileName##*.}
if [ ! ${fileName##*.} = jar ]
then
echo $1"不是jar包"
else
echo $1"是jar包"
fi
}
#sh文件所在目录
YN_BASE_PATH=$(pwd)
#jar包存放目录
YN_JAR_PATH="$YN_BASE_PATH/jars"
#当前时间
YN_NOW_TIME=$(date "+%Y-%m-%d %H:%M:%S")
if [ ! -d $YN_JAR_PATH ]; then
echo "[$YN_NOW_TIME]->>同级目录下不存在文件夹jars,请先创建并上传jar包文件"
else
YN_NOW_TIME=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$YN_NOW_TIME]->>文件夹jars已经存在,查找最新jar包并启动"
fi
#-rt 按时间正叙,-t时间倒叙,每次启动都用最新的 ,lrt是显示列表
#jar文件路径
YN_JAR_FILE=""
for item in `ls $YN_JAR_PATH -t`
do
YN_FileName=$YN_JAR_PATH"/"$item
if [ -d $YN_FileName ]; then
echo $YN_FileName"是目录"
#getDir $fileName
else
#echo $fileName "不是目录"
#echo ${fileName##*.}
YN_NOW_TIME=$(date "+%Y-%m-%d %H:%M:%S")
if [ ${YN_FileName##*.} = jar ]; then
echo $YN_NOW_TIME"找到最新的jar包"$item
YN_JAR_FILE=$YN_JAR_PATH"/"$item
break
fi
#echoFile $fileName
fi
done
if [ $YN_JAR_FILE = "" ]; then
echo "未找到jar包,程序将无法启动"
fi
echo $YN_JAR_FILE
#动态得到jar文件名 end
# GC日志参数
GC_LOG_OPTS=" -XX:+PrintGC -XX:+PrintGCDetails -Xloggc:$LOG_PATH/gc-%t.log"
# GC收集器参数
GC_OPTS="-XX:+UseConcMarkSweepGC"
# 其他参数
OTHER_OPTS="-Dspring.profiles.active=$PROFILE"
# JVM 启动参数
JVM_OPTIONS="-server -Xms64m -Xmx64m -XX:MetaspaceSize=16m $GC_OPTS $GC_LOG_OPTS $OTHER_OPTS"
# 使用说明,用来提示输入参数
usage() {
echo "Usage: demogc.sh [start|stop|restart|status]"
exit 1
}
# 检查程序是否在运行
is_exist() {
pid=$(ps -ef | grep $YN_JAR_FILE | grep -v grep | awk '{print $2}')
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
# 启动方法
start() {
is_exist
if [ $? -eq "0" ]; then
echo "WARN: $JAR_NAME is already running PID=${pid}"
else
echo "JVM_OPTIONS : "
echo $JVM_OPTIONS | sed 's/ /\n/g '
nohup ${JRE_HOME}/bin/java -jar $JVM_OPTIONS $YN_JAR_FILE >>$LOG_PATH/stdout.log 2>&1 &
echo $! >$PID
echo "INFO: start $JAR_NAME successed PID=$!"
fi
}
# 停止方法
stop() {
#is_exist
pidf=$(cat $PID)
echo "INFO: app PID = $pidf begin kill $pidf"
kill "$pidf"
rm -rf $PID
sleep 2
is_exist
if [ $? -eq "0" ]; then
echo "INFO: app 2 PID = ${pid} begin kill -9 ${pid}"
kill -9 ${pid}
sleep 2
echo "INFO: $JAR_NAME process stopped ---"
else
echo "INFO: $JAR_NAME is not running ---"
fi
}
# 输出运行状态
status() {
is_exist
if [ $? -eq "0" ]; then
echo "INFO: $JAR_NAME is running PID is $pid"
else
echo "WARN: $JAR_NAME is not running"
fi
}
# 重启
restart() {
stop
start
}
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
exit 0
一直用sh脚本启动springboot项目,可是每次跟新后都需要手动修改jar包名称或sh文件进行对应,太不方便部署了,而且对于jar包版本管理也不方便。所以在网上一顿搜罗后把sh部署脚本进行升级。实现在项目目录jars目录下存储多个jar包,自动按文件名排序取最高版本使用。
sh+systemctl部署springboot文章见:CentOS8中通过systemd(systemctl)实现springboot项目开机自动启动,使用sh脚本_yulei6的博客-优快云博客
由于本人初学,内容仅供参考,另外希望大家不理赐教!