← 中文资源

简体中文版本

Bash 日志轮换脚本

查找超过阈值的 .log 文件,支持 dry-run,并用 gzip 压缩匹配文件的小型 Bash 脚本。

阅读英文原文

项目说明

这是一个可直接运行的标准库脚本,用于清理和压缩旧日志,适合 cron 或容器初始化任务。

运行方法

赋予执行权限后传入目录和天数,例如 ./rotate.sh /var/log/app 7。使用 --dry-run 先查看将处理的文件,再实际执行。

验证方式

在临时目录创建不同修改时间的 .log 文件,运行 dry-run 确认列表,再执行并检查压缩结果。确认脚本不会跟随符号链接、不会删除正在写入的文件,并正确处理含空格的文件名。生产使用前应备份并先在非关键目录演练。

验收清单

完成「Bash 日志轮换脚本」后,按节点或操作步骤逐项自查:准备可复现的本地环境,执行文档中的命令,记录输出与失败信息,并确认权限、空数据和失败恢复路径都有对应证据。

代码示例

#!/usr/bin/env bash
set -euo pipefail
dir=${1:?usage: rotate.sh <dir> [days]}
days=${2:-30}
dry=${DRY_RUN:-0}
find "$dir" -maxdepth 1 -type f -name '*.log' -mtime +"$days" -print0 |
while IFS= read -r -d '' file; do
  if [ "$dry" = "1" ]; then
    echo "would rotate: $file"
  else
    gzip -f "$file"
    echo "rotated: $file -> $file.gz"
  fi
done
mkdir -p logs
: > logs/old.log
: > logs/new.log
touch -d '40 days ago' logs/old.log
DRY_RUN=1 bash rotate.sh logs 30
bash rotate.sh logs 30
ls logs