1、脚本功能描述
本文分享的 Shell 脚本可帮助开发者高效管理 Spring Boot 应用的 JAR 包,支持启动、停止、重启和状态检查等核心功能。主要特点包括:
- 参数化配置
- 支持自定义 JAR 路径、应用名称、日志文件和 PID 文件位置
- 可配置 Java 环境(
JAVA_HOME
)和 JVM 参数(如内存分配) - 支持指定 Spring 配置文件(
--spring.profiles.active
)和配置位置(--spring.config.location
),默认使用prod
配置
- 智能控制
- 启动时自动检测应用状态,避免重复启动
- 停止时优先使用优雅关闭(
kill
),超时后强制终止(kill -9
) - 重启功能无缝衔接停止与启动流程
- 健壮性设计
- 完整的错误处理(如 Java 路径验证、JAR 文件检查)
- 彩色输出提示,直观展示操作结果
- 详细的日志记录,便于问题排查
- 灵活易用
- 支持命令行参数(如
--profile=dev
)覆盖默认配置 - 可作为定时任务(如通过
crontab
)自动执行 - 兼容多种 Linux 环境
- 支持命令行参数(如
使用该脚本,您可以轻松管理 Spring Boot 应用的生命周期,减少手动操作的复杂度,提高运维效率。
2、使用示例
# 启动应用(默认配置)
./manage_spring_boot.sh start
# 启动应用(指定开发环境配置)
./manage_spring_boot.sh start --profile=dev --config=/custom/config/
# 停止应用
./manage_spring_boot.sh stop
# 重启应用
./manage_spring_boot.sh restart
# 查看应用状态
./manage_spring_boot.sh status
通过简单配置,该脚本即可适应不同项目需求,成为 Spring Boot 应用运维的得力助手。
3、脚本内容
#!/usr/bin/env bash
# Spring Boot JAR包管理脚本
# 使用方法: ./manage_spring_boot.sh [start|stop|restart|status] [--profile=xxx] [--config=/config/]
# 配置部分
JAR_FILE="/java-admin.jar" # 修改为你的JAR文件路径
APP_NAME="java-admin" # 应用名称,用于进程标识
LOG_FILE="/var/log/${APP_NAME}.log" # 日志文件路径
PID_FILE="/var/run/${APP_NAME}.pid" # PID文件路径
JAVA_HOME="/opt/jdk-21.0.5" # Java安装路径,根据实际情况修改
JAVA_OPTS="-Xmx512m -Xms256m" # JVM参数,可根据需要调整
SPRING_PROFILE="prod" # Spring配置文件,默认值为prod
SPRING_CONFIG="/config/" # Spring配置文件位置,默认值为/config/
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # 无颜色
# 检查命令是否存在(修改后)
check_command() {
if [ "$1" = "java" ]; then
# 直接检查JAVA_HOME配置的Java
if [ ! -x "$JAVA_HOME/bin/java" ]; then
echo -e "${RED}错误: Java命令 $JAVA_HOME/bin/java 不存在或不可执行。${NC}"
echo -e "${RED}请检查 JAVA_HOME 配置是否正确。${NC}"
exit 1
fi
else
# 其他命令仍使用系统PATH检查
command -v "$1" >/dev/null 2>&1 || { echo -e "${RED}错误: 需要$1命令但未找到。${NC}"; exit 1; }
fi
}
# 检查JAR文件是否存在
check_jar_file() {
if [ ! -f "$JAR_FILE" ]; then
echo -e "${RED}错误: JAR文件 $JAR_FILE 不存在。${NC}"
exit 1
fi
}
# 获取当前应用的PID
get_pid() {
if [ -f "$PID_FILE" ]; then
echo $(cat "$PID_FILE")
else
echo ""
fi
}
# 解析命令行参数
parse_arguments() {
for arg in "$@"; do
case $arg in
--profile=*)
SPRING_PROFILE="${arg#*=}"
shift
;;
--config=*)
SPRING_CONFIG="${arg#*=}"
shift
;;
*)
# 保留其他参数
PARAMS="$PARAMS $arg"
shift
;;
esac
done
# 重新设置位置参数
set -- $PARAMS
}
# 构建Spring参数
build_spring_options() {
local spring_opts=""
if [ -n "$SPRING_PROFILE" ]; then
spring_opts="$spring_opts --spring.profiles.active=$SPRING_PROFILE"
fi
if [ -n "$SPRING_CONFIG" ]; then
spring_opts="$spring_opts --spring.config.location=$SPRING_CONFIG"
fi
echo "$spring_opts"
}
# 检查应用是否正在运行
is_running() {
local PID=$(get_pid)
if [ -z "$PID" ]; then
return 1
fi
ps -p "$PID" >/dev/null 2>&1
return $?
}
# 启动应用
start() {
check_jar_file
if is_running; then
echo -e "${YELLOW}警告: $APP_NAME 已在运行中 (PID: $(get_pid))${NC}"
return 0
fi
echo -e "${GREEN}正在启动 $APP_NAME...${NC}"
# 创建日志目录(如果不存在)
mkdir -p "$(dirname "$LOG_FILE")"
# 构建Spring参数
SPRING_OPTS=$(build_spring_options)
# 构建Java命令
JAVA_CMD="$JAVA_HOME/bin/java"
# 检查Java命令是否存在
if [ ! -x "$JAVA_CMD" ]; then
echo -e "${RED}错误: Java命令 $JAVA_CMD 不存在或不可执行。${NC}"
echo -e "${RED}请检查 JAVA_HOME 配置是否正确。${NC}"
return 1
fi
# 打印启动信息
echo -e "${GREEN}Java路径: $JAVA_CMD${NC}"
echo -e "${GREEN}启动参数: $SPRING_OPTS${NC}"
echo -e "${GREEN}执行命令:${JAVA_CMD} ${JAVA_OPTS} -jar "${JAR_FILE}" $SPRING_OPTS"
# 启动应用
nohup $JAVA_CMD $JAVA_OPTS -jar "$JAR_FILE" $SPRING_OPTS > "$LOG_FILE" 2>&1 &
echo $! > "$PID_FILE"
# 等待应用启动
sleep 2
if is_running; then
echo -e "${GREEN}$APP_NAME 已成功启动 (PID: $(get_pid))${NC}"
echo -e "${GREEN}日志文件: $LOG_FILE${NC}"
else
echo -e "${RED}启动失败,请查看日志文件: $LOG_FILE${NC}"
return 1
fi
}
# 停止应用
stop() {
if ! is_running; then
echo -e "${YELLOW}警告: $APP_NAME 未运行${NC}"
return 0
fi
echo -e "${GREEN}正在停止 $APP_NAME...${NC}"
local PID=$(get_pid)
# 尝试正常关闭
kill "$PID"
# 等待应用停止
local wait_time=0
while is_running && [ $wait_time -lt 30 ]; do
sleep 1
wait_time=$((wait_time + 1))
done
# 如果仍在运行,强制终止
if is_running; then
echo -e "${YELLOW}应用未在30秒内停止,正在强制终止...${NC}"
kill -9 "$PID"
sleep 2
if is_running; then
echo -e "${RED}错误: 无法停止应用${NC}"
return 1
fi
fi
# 删除PID文件
if [ -f "$PID_FILE" ]; then
rm "$PID_FILE"
fi
echo -e "${GREEN}$APP_NAME 已成功停止${NC}"
}
# 重启应用
restart() {
stop
start
}
# 查看应用状态
status() {
if is_running; then
echo -e "${GREEN}$APP_NAME 正在运行中 (PID: $(get_pid))${NC}"
echo -e "${GREEN}日志文件: $LOG_FILE${NC}"
else
echo -e "${RED}$APP_NAME 未运行${NC}"
fi
}
# 显示帮助信息
show_help() {
echo "使用方法: $0 [选项] [参数]"
echo "选项:"
echo " start 启动应用"
echo " stop 停止应用"
echo " restart 重启应用"
echo " status 查看应用状态"
echo " help 显示此帮助信息"
echo "参数:"
echo " --profile=xxx 指定Spring配置文件 (默认: prod)"
echo " --config=/path/ 指定Spring配置文件位置 (默认: /config/)"
}
# 主函数
main() {
PARAMS=""
parse_arguments "$@"
check_command java
check_command ps
check_command kill
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
help)
show_help
;;
*)
echo -e "${RED}错误: 未知命令 '$1'${NC}"
show_help
exit 1
;;
esac
}
# 执行主函数
main "$@"
评论区