本脚本适用于jar包的常见启停管理,使用run.sh脚本会自动复制、启动jar包,并且在启动前判断是否已经启动,如果已经启动也会自动先停掉之前的进程
- 创建目录例如:
/home/www/project_name/
cd /home/www/project_name/
mkdir app
mkdir package
- 将脚本上传至/home/www/project_name/app
run.sh
#!/bin/bash
MODEL_NAME=$1
# ENV为启动环境配置,根据实际部署情况调整
ENV=${2:-dev}
# DNACOS_NAMESPACE为Nacos命名空间,根据实际部署情况调整
DNACOS_NAMESPACE=${3:-your_nacos_namespace_name}
BASE_PATH=`pwd`
function run(){
if [ ! -d "$MODEL_NAME" ];then
mkdir "$MODEL_NAME"
fi
sh $BASE_PATH/starter.sh $BASE_PATH/$MODEL_NAME/$MODEL_NAME.jar stop
if [ $? -eq 0 ];then
echo "停用$MODEL_NAME"
else
echo "停用$MODEL_NAME失败"
fi
rm -rf $BASE_PATH/$MODEL_NAME/$MODEL_NAME.jar
if [ $? -eq 0 ];then
echo "删除$MODEL_NAME代码包"
else
echo "删除$MODEL_NAME代码包失败"
fi
cp $BASE_PATH/../package/$MODEL_NAME.jar $BASE_PATH/$MODEL_NAME/$MODEL_NAME.jar
if [ $? -eq 0 ];then
echo "复制$MODEL_NAME代码包"
else
echo "复制$MODEL_NAME代码包失败"
return
fi
# dev为启动环境配置,根据实际部署情况调整
sh $BASE_PATH/starter.sh $BASE_PATH/$MODEL_NAME/$MODEL_NAME.jar start $ENV -DNACOS_NAMESPACE=$DNACOS_NAMESPACE
if [ $? -eq 0 ];then
echo "启动$MODEL_NAME"
else
echo "启动$MODEL_NAME失败"
fi
}
MODEL_NAME="$1"
run
starter.sh
这starter.sh里开头的JAVA_CMD因为我这里有的机器which java没能识别到正确的java目录,就直接写死了,可以根据自己环境调整java目录、版本、或者使用which java。
#!/bin/bash
#本脚本基本无需改动,注意要点均已用中文说明
# 1. 请将本脚本放到Linux系统的path路径下,最好是/bin目录下
# 2. 请给本脚本设备可执行权限
# 3. 启动示例 sh starter.sh xxx start
# 4. 重启示例 sh starter.sh xxx restart
# 5. 停止示例 sh starter.sh xxx stop
# 6. 查看状态示例 sh starter.sh xxx status
## 获取 java 命令的路径
JAVA_CMD=`which java`
# JAVA_CMD=/usr/local/lib/java/jdk1.8.0_401/bin/java;
if [ -z "${JAVA_CMD}" ];then
echo "Please install the Java environment";
exit 1;
fi
## 输出本命令的使用方法 并退出
usage() {
echo "Usage: springboot-starter [app_name].jar [start|stop|restart|status]"
exit 1
}
## 判断是否输入了两个参数
if [ $# -lt 2 ]; then
usage
fi
## 脚本名称
APP_NAME=$1;
## 操作
OPERATION=$2;
## 运行模式
MODEL=$3;
if [ -z "$MODEL" ]; then
MODEL="prod"
fi
## 其它参数处理
OTHER_ARGS=""
if [ $# -gt 3 ]; then
shift 3
else
shift $#
fi
for ARG in $*
do
OTHER_ARGS="$OTHER_ARGS $ARG"
done
COUNT=1
RETRY=10
SLEEP=10
## 脚本所在目录,绝对路径表示
BASE_PATH=$(cd `dirname $APP_NAME`;pwd)
## 去掉所有目录后的脚本名
APP_NAME=${APP_NAME##*/}
## 脚本的路径,绝对路径表示
APP_PATH=$BASE_PATH"/"$APP_NAME
## 判断目标程序是否已经启动
is_running(){
echo ${APP_PATH}
## 尝试获取已经运行程序的PID
PID=`ps -ef|grep ${APP_PATH}|grep -v grep|grep -v starter.sh|awk '{ print $2 }'`
echo ${PID}
if [ -z "${PID}" ]; then
return 0
else
return 1
fi
}
## 启动程序
start(){
is_running
if [ $? -eq "1" ]; then
echo "${APP_NAME} is already running. pid is ${PID} ."
if [ $COUNT -le $RETRY ]; then
echo "retry ${COUNT} ...... "
COUNT=`expr $COUNT + 1`
sleep $SLEEP
start
fi
else
## 启动 jar 包
echo "${APP_NAME} starting ...... "
# 创建日志目录
LOG_DIR="${BASE_PATH}/logs"
if [ ! -d "$LOG_DIR" ]; then
mkdir -p "$LOG_DIR"
fi
# 启动命令,添加日志相关配置
nohup ${JAVA_CMD} -jar \
-Xmx512m -Xms512m \
${OTHER_ARGS} \
-Dspring.profiles.active=${MODEL} \
-Dlogging.file.path=${LOG_DIR} \
-Dlogging.file.name=${LOG_DIR}/${APP_NAME}.log \
-Dlogback.filesize=50MB \
-Dlogback.filemaxday=7 \
${APP_PATH} > ${LOG_DIR}/startup.log 2>&1 &
echo "nohup ${JAVA_CMD} -jar -Xmx512m -Xms512m ${OTHER_ARGS} -Dspring.profiles.active=${MODEL} ${APP_PATH} started"
sleep 1
echo "${APP_NAME} started completed "
echo ""
fi
}
## 停止程序
stop(){
is_running
if [ $? -eq "1" ]; then
echo "PID is ${PID}, ${APP_NAME} stopping ...... "
kill -9 ${PID}
if [ $? -ne "0" ]; then
echo "kill ${PID} failed,execute kill -9 ${PID}"
kill -9 ${PID}
fi
sleep 1
echo "${APP_NAME} stopped completed "
else
echo "${APP_NAME} is not running"
fi
}
## 输出程序运行状态
status(){
is_running
if [ $? -eq "1" ]; then
echo "${APP_NAME} is running. pid is ${PID}"
else
echo "${APP_NAME} is NOT running."
fi
}
## 重启程序
restart(){
stop
start
}
case "$OPERATION" in
"start")
start ;;
"stop")
stop ;;
"status")
status ;;
"restart")
restart ;;
*)
usage ;;
esac
exit 0
- 上传jar包至/home/www/project_name/package
- 将脚本赋权可执行权限
cd /home/www/project_name/app
chmod +x *.sh
- 编辑脚本的激活使用的配置文件以及nacos的命名空间名(建议打包时候也在配置文件里保持一致)
vim /home/www/project_name/app/run.sh
# ENV为启动环境配置,根据实际部署情况调整
ENV=${2:-dev}
# DNACOS_NAMESPACE为Nacos命名空间,根据实际部署情况调整
DNACOS_NAMESPACE=${3:-your_nacos_namespace_name}
- 启动jar包
cd /home/www/project_name/app
# 假设要启动的是/home/www/project_name/package/jar_name.jar
./run.sh jar_name
脚本会将package中的包复制到app目录下对应jar包名称的文件夹(如果没有会自动创建)下,并且启动,后续使用只需要更新package目录里的jar包,重新启动对应jar就行
./run.sh jar_name
# 注意,不要因为linux的自动补全在结尾额外加上/ 比如 .run.sh jar_name/ 这样会找不到对应jar包