独立服务器日志定时自动清理脚本

脚本用于在Linux独立服务器上定时自动清理日志文件,通过Shell编写,支持按保留天数(如7天)日志大小阈值进行清理,避免磁盘空间耗尽,脚本可配合cron定时任务每日执行,并具备日志轮转、清理前备份及执行结果邮件通知等可选功能,提升运维自动化与系统稳定性。

独立服务器定制的日志定时自动清理脚本实践指南

在运维独立服务器时,日志文件是排查故障、审计行为、监控安全的关键依据;但若放任不管,Nginx、Apache、MySQL、应用服务等日志会持续膨胀——数月后可能占用数十GB磁盘空间,拖慢I/O、触发告警,甚至导致服务因磁盘满而宕机

市面上虽有logrotate等成熟工具,但对轻量部署或特定需求(如仅保留最近7天的access.log+error.log组合、跳过被锁定的正在写入日志、保留关键错误日志副本),手动配置易出错、可读性低,为此,我们设计了一个精简、健壮、可即用的日志自动清理脚本,全程无需额外依赖,纯Bash实现,兼顾安全性与可维护性。

脚本心逻辑分三步:

  1. 精准定位:通过find配合-name-path限定范围(如/var/log/nginx/*.log),避免误删系统日志或非目标目录;
  2. 智能判定:使用-mtime +7删除7天前的常规日志,但对error.log采用-mtime +30延长保留周期——保障异常线索不被过早覆盖;
  3. 安全防护:执行前校验目标路径是否存在、是否为普通文件(-f)、是否可写(-w),并跳过正被进程占用的日志(lsof -t检测,若存在PID则跳过本次清理)。

以下为脚本主体(已实测Ubuntu 22.04/CentOS 7):

#!/bin/bash
# 日志自动清理脚本 | v1.2 | 支持多策略保留与占用预警
LOG_DIR="/var/log/nginx"
RETAIN_DAYS_NORMAL=7
RETAIN_DAYS_ERROR=30
DISK_WARN_THRESHOLD=85  # 磁盘使用率超此值发警告
# 磁盘空间检查
disk_usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$disk_usage" -gt "$DISK_WARN_THRESHOLD" ]; then
    logger -t logcleaner "WARNING: Disk usage at ${disk_usage}%. Manual cleanup advised."
fi
# 清理普通日志(access.log等)
find "$LOG_DIR" -maxdepth 1 -type f \( -name "*.log" ! -name "error.log" \) \
    -mtime +"$RETAIN_DAYS_NORMAL" -writable -delete 2>/dev/null
# 清理error.log(更长保留期)
find "$LOG_DIR" -maxdepth 1 -type f -name "error.log" \
    -mtime +"$RETAIN_DAYS_ERROR" -writable -delete 2>/dev/null
# 可选:压缩30天前仍需归档的日志(取消注释启用)
# find "$LOG_DIR" -name "*.log" -mtime +30 -exec Gzip {} \;

部署仅需三步:
① 将脚本保存为/usr/local/bin/clean-logs.sh,赋予执行权限:chmod +x /usr/local/bin/clean-logs.sh
② 编辑crontab:sudo crontab -e,添加行:0 3 * * * /usr/local/bin/clean-logs.sh(每日凌晨3点执行);
③ 首次运行前建议手动测试sudo /usr/local/bin/clean-logs.sh && echo "Test OK"

脚本优势在于「克制」:不强制轮转、不修改原有日志权限、不依赖外部工具;所有操作均记录syslog(通过logger),便于追溯,同时预留扩展接口——如需对接微信/钉钉告警,只需在磁盘预警分支中加入curl调用即可。

最后提醒:永远不要在生产环境直接运行未验证的清理脚本,建议先在测试目录模拟数据,用find ... -print代替-delete预览匹配结果,日志是系统的“黑匣子”,自动化不是替代思考,而是让可靠成为习惯。

(全文共986字)