ANALYSIS
- 要求
PRTCL // SHELL
✅ 自动备份日志文件(如 `app.log` → `app.log.1`)✅ 压缩旧日志(使用 `gzip` 节省空间)✅ 保留最近 N 份日志(默认保留 7 天)✅ 安全处理:不删除原日志直到新日志创建成功✅ 适合放入 `crontab` 定时执行PRTCL // SHELL
#!/bin/bash# ==============================================================================# 功能: 简单的日志轮转与压缩脚本(适合初学者学习和使用)# 作者: 汪号然# 用法:# chmod +x logrotate_simple.sh# ./logrotate_simple.sh /path/to/your.log# 可配合 crontab 每天自动运行# ==============================================================================
# 检查是否传入了日志文件路径if [ $# -eq 0 ]; then echo "错误: 请提供要轮转的日志文件路径" echo "用法: $0 /path/to/your.log" exit 1fi
# 获取用户传入的日志文件路径LOG_FILE="$1"
# 检查日志文件是否存在if [ ! -f "$LOG_FILE" ]; then echo "错误: 日志文件不存在: $LOG_FILE" exit 1fi
# 设置保留的旧日志数量(例如保留最近 7 份)MAX_BACKUPS=7
# 获取日志文件所在目录和文件名(不带路径)LOG_DIR=$(dirname "$LOG_FILE")LOG_BASENAME=$(basename "$LOG_FILE")
echo "开始轮转日志: $LOG_FILE"
# =============== 第一步:删除最旧的备份(如果超过 MAX_BACKUPS)===============# 例如:如果 MAX_BACKUPS=7,就删除 app.log.7.gzOLDEST_BACKUP="${LOG_DIR}/${LOG_BASENAME}.${MAX_BACKUPS}.gz"if [ -f "$OLDEST_BACKUP" ]; then echo "删除最旧备份: $OLDEST_BACKUP" rm -f "$OLDEST_BACKUP"fi
# =============== 第二步:将旧备份依次后移(从大到小移动,避免覆盖)===============# 例如:app.log.6.gz → app.log.7.gz, app.log.5.gz → app.log.6.gz, ...for ((i=MAX_BACKUPS-1; i>=1; i--)); do CURRENT_BACKUP="${LOG_DIR}/${LOG_BASENAME}.${i}.gz" NEXT_BACKUP="${LOG_DIR}/${LOG_BASENAME}.$((i+1)).gz"
# 如果当前编号的备份存在,就把它重命名为下一个编号 if [ -f "$CURRENT_BACKUP" ]; then echo "移动: $CURRENT_BACKUP → $NEXT_BACKUP" mv "$CURRENT_BACKUP" "$NEXT_BACKUP" fidone
# =============== 第三步:压缩当前日志文件为 .1.gz ===============================# 例如:app.log → app.log.1.gzCURRENT_LOG_BACKUP="${LOG_DIR}/${LOG_BASENAME}.1.gz"
# 先压缩原日志文件(保留原文件)echo "压缩当前日志为: $CURRENT_LOG_BACKUP"gzip -c "$LOG_FILE" > "$CURRENT_LOG_BACKUP"
# =============== 第四步:清空原日志文件(而不是删除!)==========================# 原因:很多程序会一直写入原文件句柄,删除会导致文件描述符失效# 正确做法:清空内容,保留 inodeecho "清空原日志文件: $LOG_FILE"> "$LOG_FILE"
echo "日志轮转完成!"echo "保留的备份: ${LOG_DIR}/${LOG_BASENAME}.[1-${MAX_BACKUPS}].gz"R P
Rhine Lab Pioneer Division
Auth_Verified: 2026.04.08
Auth_Verified: 2026.04.08
