linux 环境定义jar启动 shell, 日志输出到 *.log 要求:设置回旋日志,每日备份一次,仅保留近3日的日志。

发布于:2025-07-02 ⋅ 阅读:(20) ⋅ 点赞:(0)

1. 脚本范式

#!/bin/bash

# 定义应用名称和基础目录
APP_NAME="your application name"
BASE_DIR=$(dirname $(readlink -f "$0"))
LOG_DIR="${BASE_DIR}/logs"
JAR_FILE="${BASE_DIR}/${APP_NAME}.jar"

# 创建日志目录(如果不存在)
mkdir -p "${LOG_DIR}"

# 定义日志文件路径
LOG_FILE="${LOG_DIR}/${APP_NAME}.log"
PID_FILE="${BASE_DIR}/${APP_NAME}.pid"

# JVM和应用启动参数配置
JAVA_OPT="-Xmx1000m -Xms1000m -Dfile.encoding=utf-8"
APP_OPT="--server.port=8089 --spring.profiles.active=prod"

# 检查JAR文件是否存在
if [ ! -f "${JAR_FILE}" ]; then
    echo "错误: JAR文件 '${JAR_FILE}' 不存在!"
    exit 1
fi

# 日志回旋函数
rotate_logs() {
    # 检查日志文件是否存在且大于0字节
    if [ -f "${LOG_FILE}" ] && [ -s "${LOG_FILE}" ]; then
        # 获取当前日期
        DATE=$(date +%Y%m%d)
        # 创建备份文件
        BACKUP_FILE="${LOG_DIR}/${APP_NAME}_${DATE}.log"
        cp "${LOG_FILE}" "${BACKUP_FILE}"
        # 清空当前日志文件
        > "${LOG_FILE}"
        
        # 删除3天前的日志
        find "${LOG_DIR}" -name "${APP_NAME}_*.log" -type f -mtime +2 -exec rm -f {} \;
    fi
}

# 启动应用函数
start_app() {
    # 检查应用是否已运行
    if [ -f "${PID_FILE}" ]; then
        PID=$(cat "${PID_FILE}")
        if ps -p "${PID}" > /dev/null; then
            echo "应用 '${APP_NAME}' 已在运行中,PID: ${PID}"
            return 1
        fi
    fi
    
    # 执行日志回旋
    rotate_logs
    
    # 启动Java应用,将输出重定向到日志文件
    nohup java ${JAVA_OPT} -jar "${JAR_FILE}" ${APP_OPT} > "${LOG_FILE}" 2>&1 &
    
    # 记录PID
    echo $! > "${PID_FILE}"
    
    echo "应用 '${APP_NAME}' 已启动,PID: $!"
    echo "日志文件: ${LOG_FILE}"
}

# 停止应用函数
stop_app() {
    if [ -f "${PID_FILE}" ]; then
        PID=$(cat "${PID_FILE}")
        if ps -p "${PID}" > /dev/null; then
            echo "正在停止应用 '${APP_NAME}' (PID: ${PID})..."
            kill "${PID}"
            
            # 等待应用停止
            for i in {1..10}; do
                if ! ps -p "${PID}" > /dev/null; then
                    echo "应用 '${APP_NAME}' 已停止"
                    rm -f "${PID_FILE}"
                    return 0
                fi
                sleep 1
            done
            
            # 如果10秒后仍未停止,则强制终止
            echo "应用未在10秒内停止,正在强制终止..."
            kill -9 "${PID}"
            rm -f "${PID_FILE}"
            echo "应用 '${APP_NAME}' 已强制终止"
        else
            echo "应用 '${APP_NAME}' 未在运行中,但PID文件存在"
            rm -f "${PID_FILE}"
        fi
    else
        echo "应用 '${APP_NAME}' 未在运行中"
    fi
}

# 显示状态函数
status_app() {
    if [ -f "${PID_FILE}" ]; then
        PID=$(cat "${PID_FILE}")
        if ps -p "${PID}" > /dev/null; then
            echo "应用 '${APP_NAME}' 正在运行中,PID: ${PID}"
            echo "日志文件: ${LOG_FILE}"
            return 0
        else
            echo "应用 '${APP_NAME}' 未在运行中,但PID文件存在"
            rm -f "${PID_FILE}"
        fi
    else
        echo "应用 '${APP_NAME}' 未在运行中"
    fi
    return 1
}

# 显示帮助信息
show_help() {
    echo "用法: $0 [start|stop|restart|status|log]"
    echo "  start    - 启动应用"
    echo "  stop     - 停止应用"
    echo "  restart  - 重启应用"
    echo "  status   - 查看应用状态"
    echo "  log      - 查看实时日志"
    echo "  backup   - 手动执行日志备份"
}

# 查看实时日志
tail_log() {
    if [ -f "${LOG_FILE}" ]; then
        echo "实时查看日志: ${LOG_FILE}"
        echo "按 Ctrl+C 退出查看"
        tail -f "${LOG_FILE}"
    else
        echo "日志文件 '${LOG_FILE}' 不存在!"
    fi
}

# 执行日志备份
manual_backup() {
    echo "正在执行手动日志备份..."
    rotate_logs
    echo "日志备份完成"
}

# 根据参数执行相应操作
case "$1" in
    start)
        start_app
        ;;
    stop)
        stop_app
        ;;
    restart)
        stop_app
        start_app
        ;;
    status)
        status_app
        ;;
    log)
        tail_log
        ;;
    backup)
        manual_backup
        ;;
    *)
        show_help
        exit 1
        ;;
esac

exit 0

2.脚本说明

这个脚本实现了以下功能:
日志回旋机制:每次启动应用时自动检查并备份前一天的日志
日志保留策略:只保留最近 3 天的日志文件,自动删除旧日志
完整的应用管理功能:支持启动、停止、重启、查看状态等操作
日志查看功能:可以实时查看应用日志输出

使用方法:
将脚本保存为 startup.sh
确保 JAR 文件与脚本在同一目录下,或者修改脚本中的 JAR_FILE 变量指向正确的 JAR 文件路径
赋予脚本执行权限:chmod +x startup.sh

启动应用:./startup.sh start
停止应用:./startup.sh stop
查看状态:./startup.sh status
查看日志:./startup.sh log

3.定时任务定期执行备份与删除

要实现每日自动备份,可以将以下行添加到 cron 任务中(使用 crontab -e 编辑):

0 0 * * * /path/to/startup.sh backup >/dev/null 2>&1

这将每天午夜执行一次日志备份操作。


网站公告

今日签到

点亮在社区的每一天
去签到