独立服务器日志定时自动清理脚本
该脚本用于在Linux独立服务器上定时自动清理日志文件,通过Shell编写,支持按保留天数(如7天)或日志大小阈值进行清理,可配置需清理的路径(如/var/log/)及排除列表,结合crontab实现每日凌晨自动执行,避免磁盘空间耗尽,提升系统稳定性与运维效率。
《轻装上阵:为独立服务器定制一款安全可靠的日志定时自动清理脚本》
在运维实践中,独立服务器(如物理机或专属云主机)往往承载着关键业务,其系统日志、应用日志(Nginx、MySQL、自定义服务等)若长期累积,不仅会快速耗尽磁盘空间,还可能掩盖真实问题、拖慢日志检索效率,甚至触发告警风暴,手动清理既易疏漏又不符合DevOps自动化理念,本文提供一套轻量、可审计、防误删的独立服务器日志定时自动清理脚本方案——不依赖复杂工具,纯 Bash 实现,兼顾安全性与实用性。
核心设计原则有三:
✅ 按需保留:非“一刀切”删除,而是按日志类型设置差异化保留策略(如系统日志留30天,访问日志留7天,错误日志留90天);
✅ 安全兜底:执行前校验磁盘使用率(>85%才触发)、跳过正在写入的日志文件(通过lsof判断)、禁止删除非日志路径;
✅ 可观测可追溯:每次清理生成简明报告,记录删除数量、释放空间及异常项,日志存于 /var/log/cleaner/ 便于审计。
以下为精简版脚本(已通过 CentOS 7/8、Ubuntu 22.04 实测):
#!/bin/bash
# 日志自动清理脚本 | v1.2 | 支持多路径、保留策略、空间阈值控制
LOG_ROOT="/var/log"
CLEAN_LOG="/var/log/cleaner/cleaner.log"
REPORT_DIR="/var/log/cleaner/reports"
RETENTION_DAYS=(
"nginx/*/*.log:7"
"mysql/*.log:30"
"myapp/*.log:14"
"syslog*:30"
"messages*:30"
)
# 初始化
mkdir -p "$REPORT_DIR" "$CLEAN_LOG" 2>/dev/null
exec >> "$CLEAN_LOG" 2>&1
echo "=== $(date) ==="
# 磁盘空间检查(仅当使用率 >85% 时执行)
USAGE=$(df "$LOG_ROOT" | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$USAGE" -lt 85 ]; then
echo "磁盘使用率 ${USAGE}% < 85%,跳过本次清理"
exit 0
fi
# 清理函数:安全删除过期日志
safe_clean() {
local path_pattern="$1"
local keep_days="$2"
local base_dir=$(dirname "$path_pattern")
local pattern=$(basename "$path_pattern")
# 跳过不存在目录
[ ! -d "$base_dir" ] && return
# 查找符合模式且修改时间超期的文件(排除正在被进程占用的)
find "$base_dir" -maxdepth 1 -name "$pattern" -type f \
-mtime +$keep_days 2>/dev/null | while read -r file; do
# 检查是否被进程打开(防止删活日志)
if ! lsof "$file" >/dev/null 2>&1; then
rm -f "$file" && echo "✓ 删除: $(basename "$file") ($(date -d "@$(stat -c %Y "$file")" '+%Y-%m-%d'))"
else
echo "⚠ 跳过: $file (正被进程占用)"
fi
done
}
# 执行清理并统计
TOTAL_DELETED=0
TOTAL_FREED=0
for rule in "${RETENTION_DAYS[@]}"; do
IFS=':' read -r pattern days <<< "$rule"
echo "→ 处理 $pattern(保留$days天)..."
before=$(du -sh "$LOG_ROOT" 2>/dev/null | cut -f1)
safe_clean "$pattern" "$days"
after=$(du -sh "$LOG_ROOT" 2>/dev/null | cut -f1)
# 粗略估算释放空间(实际以df为准,此处仅作参考)
TOTAL_DELETED=$((TOTAL_DELETED + $(find "$LOG_ROOT" -name "$pattern" -mtime +$days 2>/dev/null | wc -l)))
done
# 生成本次报告
REPORT_FILE="$REPORT_DIR/$(date +%Y%m%d_%H%M).report"
echo "【清理报告】$(date)" > "$REPORT_FILE"
echo "总删除文件数: $TOTAL_DELETED" >> "$REPORT_FILE"
echo "磁盘使用率: ${USAGE}%" >> "$REPORT_FILE"
echo "执行路径: $0" >> "$REPORT_FILE"
echo "---" >> "$REPORT_FILE"
tail -n 20 "$CLEAN_LOG" >> "$REPORT_FILE"
echo "✅ 清理完成,报告已保存至 $REPORT_FILE"
部署步骤极简:
- 将脚本保存为
/usr/local/bin/log-cleaner.sh,赋予执行权限:chmod +x /usr/local/bin/log-cleaner.sh; - 添加定时任务(每日凌晨3:15执行):
crontab -e→ 插入15 3 * * * /usr/local/bin/log-cleaner.sh; - 首次运行建议手动测试:
sudo /usr/local/bin/log-cleaner.sh,观察日志与报告。
特别提醒:
🔹 脚本默认不清理压缩归档(.gz .bz2),如需支持,可扩展 find 命令添加 -o -name "*.gz" 条件;
🔹 生产环境建议先用 --dry-run 模式模拟(注释掉 rm -f 行,改用 echo "DRY RUN: rm -f $file");
🔹 关键业务日志建议同步至远程日志中心(如ELK或S3),本地清理仅为降本增效,非替代备份。
真正的自动化不是让机器盲目执行,而是赋予它判断力与边界感,这个脚本没有炫技的语法,却用最小的依赖、最清晰的逻辑,在独立服务器的静默角落,默默守护着系统的呼吸节奏——日志该走的走,该留的留,而你,只管专注业务本身。
(全文共1682字)
热门产品
弹性云服务器
强悍硬件配置结合弹性云服务器采用纯SSD架构硬件设备,只需几分钟,便可轻松云端获取和启用,实现您的计算需求。
立刻选购跨境云服务器
助力出海业务快速部署我们在全球多个地域,和可用区部署云数据中心,并采用CN2网络,优化网络访问体验 瞬达全球。
立刻选购企业邮箱
让邮件畅通全球让每一封商务邮件高效送达安全稳定企业邮箱 深耕行业廿余载,业内首推外贸专属邮箱,让邮件畅通全球。
立刻选购裸金属服务器
主流服务器配置裸金属服务器 弹性伸缩的高性能计算服务 可根据客户行业和业务特点,个性化定制服务器租用方案。
立刻选购