侧边栏壁纸
博主头像
小白不想白 博主等级

行动起来,活在当下

  • 累计撰写 21 篇文章
  • 累计创建 5 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

Spring Boot JAR 包管理脚本:一键实现启动、停止、重启与状态监控

小白不想白
2025-05-17 / 0 评论 / 0 点赞 / 3 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1、脚本功能描述

本文分享的 Shell 脚本可帮助开发者高效管理 Spring Boot 应用的 JAR 包,支持启动、停止、重启和状态检查等核心功能。主要特点包括:

  1. 参数化配置
    • 支持自定义 JAR 路径、应用名称、日志文件和 PID 文件位置
    • 可配置 Java 环境(JAVA_HOME)和 JVM 参数(如内存分配)
    • 支持指定 Spring 配置文件(--spring.profiles.active)和配置位置(--spring.config.location),默认使用 prod配置
  2. 智能控制
    • 启动时自动检测应用状态,避免重复启动
    • 停止时优先使用优雅关闭(kill),超时后强制终止(kill -9
    • 重启功能无缝衔接停止与启动流程
  3. 健壮性设计
    • 完整的错误处理(如 Java 路径验证、JAR 文件检查)
    • 彩色输出提示,直观展示操作结果
    • 详细的日志记录,便于问题排查
  4. 灵活易用
    • 支持命令行参数(如 --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 "$@"

0

评论区