项目说明
这是一个可直接运行的标准库脚本,用于清理和压缩旧日志,适合 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