Spring Boot Jar包生产级启停脚本

一、脚本

bash 复制代码
#!/bin/bash
# 脚本名称:app-manager.sh
# 功能:Java应用启停管理脚本
# 使用方式:./app-manager.sh [start|stop|restart|status|logs|clean|help]

# ====================== 核心配置(必改)======================
APP_NAME="idiomatic-enligh-backend"       # 应用名称(自定义)
JAR_FILE="idiomatic-enligh-backend-1.0.jar" # JAR包路径(绝对路径/相对路径)
LOG_DIR="./logs"                          # 日志目录
PID_FILE="./app.pid"                      # PID文件(记录进程ID)
# JVM参数
JAVA_OPTS="-Dfile.encoding=UTF-8 -Xms512m -Xmx512m"
# 日志清理配置(可按需调整)
LOG_BACKUP_DAYS=7                         # 保留最近7天的日志备份
MAX_LOG_SIZE="100M"                       # 单日志文件最大大小(可选,用于切割提示)
# =============================================================

# 颜色定义(增强提示)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 重置颜色

# ========== 创建日志目录 ==========
mkdir -p ${LOG_DIR}
LOG_FILE="${LOG_DIR}/${APP_NAME}.log"

# ========== 检查Java环境 ==========
check_java() {
    if ! command -v java &> /dev/null; then
        echo -e "${RED}[ERROR] 未找到Java环境,请先安装JDK并配置环境变量!${NC}"
        exit 1
    fi
}

# ========== 检查JAR包是否存在 ==========
check_jar() {
    if [ ! -f "${JAR_FILE}" ]; then
        echo -e "${RED}[ERROR] JAR包不存在:${JAR_FILE},请检查配置!${NC}"
        exit 1
    fi
}

# ========== 检查进程是否运行 ==========
check_running() {
    if [ -f ${PID_FILE} ]; then
        PID=$(cat ${PID_FILE})
        # 不仅检查PID是否存在,还验证是否是当前应用的进程
        if ps -p ${PID} -o cmd= | grep -q "${JAR_FILE}"; then
            return 0 # 运行中
        else
            rm -f ${PID_FILE} # PID文件无效,删除
            return 1 # 未运行
        fi
    fi
    return 1 # 未运行
}

# ========== 启动应用 ==========
start() {
    # 前置检查
    check_java
    check_jar

    if check_running; then
        echo -e "${YELLOW}[${APP_NAME}] 应用已运行(PID:${PID})${NC}"
        return
    fi

    echo -e "启动 [${APP_NAME}]..."
    nohup java ${JAVA_OPTS} -jar ${JAR_FILE} > ${LOG_FILE} 2>&1 &
    echo $! > ${PID_FILE}

    # 等待2秒检查启动状态
    sleep 2
    if check_running; then
        echo -e "${GREEN}[${APP_NAME}] 启动成功!${NC}"
        echo -e "日志文件:${LOG_FILE}"
        echo -e "进程PID:$(cat ${PID_FILE})"
    else
        echo -e "${RED}[${APP_NAME}] 启动失败!请查看日志:${LOG_FILE}${NC}"
        rm -f ${PID_FILE}
    fi
}

# ========== 停止应用 ==========
stop() {
    if ! check_running; then
        echo -e "${YELLOW}[${APP_NAME}] 应用未运行${NC}"
        return
    fi

    echo -e "停止 [${APP_NAME}](PID:${PID})..."
    kill ${PID} > /dev/null 2>&1
    sleep 5

    # 强制杀死残留进程
    if ps -p ${PID} > /dev/null 2>&1; then
        echo -e "强制停止进程..."
        kill -9 ${PID} > /dev/null 2>&1
    fi

    rm -f ${PID_FILE}
    echo -e "${GREEN}[${APP_NAME}] 已停止${NC}"
}

# ========== 查看状态 ==========
status() {
    if check_running; then
        echo -e "${GREEN}[${APP_NAME}] 运行中(PID:${PID})${NC}"
        # 可选:显示日志文件大小
        if [ -f ${LOG_FILE} ]; then
            LOG_SIZE=$(du -h ${LOG_FILE} | awk '{print $1}')
            echo -e "${BLUE}[INFO] 日志文件大小:${LOG_SIZE}(最大建议:${MAX_LOG_SIZE})${NC}"
        fi
    else
        echo -e "${RED}[${APP_NAME}] 未运行${NC}"
    fi
}

# 重启函数
restart() {
    echo -e "重启 [${APP_NAME}]..."
    stop
    sleep 3
    start
}

# ========== 实时查看日志 ==========
logs() {
    if [ ! -f ${LOG_FILE} ]; then
        echo -e "${YELLOW}[WARN] 日志文件不存在:${LOG_FILE}(应用可能未启动)${NC}"
        return 1
    fi

    echo -e "${BLUE}[INFO] 实时查看${APP_NAME}日志(按 Ctrl+C 退出)...${NC}"
    echo -e "${BLUE}[INFO] 日志文件:${LOG_FILE}${NC}"
    # 实时跟踪日志,同时显示行号
    tail -f -n 100 ${LOG_FILE}
}

# ========== 清理旧日志 ==========
clean() {
    echo -e "${BLUE}[INFO] 开始清理${APP_NAME}旧日志(保留最近${LOG_BACKUP_DAYS}天)...${NC}"

    # 清理日志目录下超过指定天数的日志文件(含备份/压缩包)
    find ${LOG_DIR} -name "${APP_NAME}*.log*" -type f -mtime +${LOG_BACKUP_DAYS} -print | while read log; do
        echo -e "${YELLOW}[INFO] 删除旧日志:${log}${NC}"
        rm -f ${log}
    done

    # 检查是否有超大日志文件,给出提示
    if [ -f ${LOG_FILE} ]; then
        LOG_SIZE=$(du -b ${LOG_FILE} | awk '{print $1}')
        MAX_SIZE=$(numfmt --from=iec ${MAX_LOG_SIZE})
        if [ ${LOG_SIZE} -ge ${MAX_SIZE} ]; then
            echo -e "${YELLOW}[WARN] 当前日志文件超过${MAX_LOG_SIZE},建议重启应用触发日志切割!${NC}"
        fi
    fi

    echo -e "${GREEN}[SUCCESS] 旧日志清理完成!${NC}"
}

# ========== 查看帮助 ==========
help() {
    echo -e "${BLUE}=============================================${NC}"
    echo -e "${BLUE}${APP_NAME} 应用管理脚本 - 使用帮助${NC}"
    echo -e "${BLUE}=============================================${NC}"
    echo -e "${YELLOW}用法:${NC} ./app-manager.sh [命令]"
    echo -e "${YELLOW}命令列表:${NC}"
    echo -e "  start    - 启动应用(自动检查Java环境/JAR包)"
    echo -e "  stop     - 停止应用(先优雅停止,超时强制杀死)"
    echo -e "  restart  - 重启应用(先停止,再启动)"
    echo -e "  status   - 查看应用运行状态(含日志文件大小)"
    echo -e "  logs     - 实时查看应用日志(默认显示最后100行,Ctrl+C退出)"
    echo -e "  clean    - 清理旧日志(保留最近${LOG_BACKUP_DAYS}天,删除过期日志)"
    echo -e "  help     - 查看此帮助信息"
    echo -e "${BLUE}=============================================${NC}"
}

# 脚本入口
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    status)
        status
        ;;
    logs)
        logs
        ;;
    clean)
        clean
        ;;
    help|--help|-h)
        help
        ;;
    *)
        echo -e "${RED}使用错误!输入 ./app-manager.sh help 查看帮助${NC}"
        exit 1
        ;;
esac

exit 0

二、使用方法

bash 复制代码
# 安装dos2unix(CentOS/RHEL)

yum install -y dos2unix

# 转换脚本换行符

dos2unix app-manager.sh

# 赋予执行权限

chmod +x app-manager.sh

# 启动

./app-manager.sh start
相关推荐
Doro再努力2 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
senijusene2 小时前
Linux软件编程:IO编程,标准IO(1)
linux·运维·服务器
Yvonne爱编码2 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚2 小时前
JAVA进阶之路——无奖问答挑战1
java·开发语言
忧郁的橙子.2 小时前
02-本地部署Ollama、Python
linux·运维·服务器
你这个代码我看不懂2 小时前
@ConditionalOnProperty不直接使用松绑定规则
java·开发语言
醇氧2 小时前
【linux】查看发行版信息
linux·运维·服务器
fuquxiaoguang2 小时前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
琹箐2 小时前
最大堆和最小堆 实现思路
java·开发语言·算法