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
这将每天午夜执行一次日志备份操作。