磁盘空间爆满自动清理日志定时任务

为何日志会占满磁盘?

很多新手服务器运维者都会遇到类似情况:网站运行正常,但突然 SSH 连不上、宝塔面板报错“磁盘剩余0字节”。
排查下来,往往是 /var/log/nginx/logs 或应用日志目录下积累了海量旧日志。
如果不及时清理,轻则服务异常,重则系统无法启动。

本文用最简单的方式教会你通过 Linux 的 cron 定时任务自动化清理过期日志,一台服务器从配置到验证只需不到 10 分钟。

清理前的准备工作

需要的东西:

  • 一台已登录 SSH 的 Linux 服务器(CentOS / Ubuntu / Debian 均可)
  • root 权限或具备 sudo 权限的用户
  • 确认日志存放目录(常用路径:/var/log/www/server/nginx/logs 等)

建议先手工查看磁盘占用:

df -h

如果发现 /dev/vda1/dev/sda1 占用到 90% 以上,就可以开搞了。

编写日志清理脚本

这里写一个通用脚本 clean_logs.sh,删除 7 天前的 .log 文件。

# 创建脚本目录
mkdir -p /root/scripts
# 编辑脚本文件
vim /root/scripts/clean_logs.sh

粘贴以下内容:

#!/bin/bash
# 清理日志脚本 - 保留最近7天
LOG_DIRS=(
    "/var/log"
    "/www/server/nginx/logs"
)
for dir in "${LOG_DIRS[@]}"; do
    find "$dir" -name "*.log" -type f -mtime +7 -delete
    # 如果还需要清理旧日志压缩包,取消下一行注释
    # find "$dir" -name "*.gz" -type f -mtime +7 -delete
done

保存后赋予执行权限:

chmod +x /root/scripts/clean_logs.sh

说明: -mtime +7 表示修改时间超过 7 天的文件,可根据业务调整(例如 +3 保留 3 天)。
如果日志有.gz格式的归档包,建议一并清理。

设置定时任务(cron)

执行以下命令打开当前用户的 crontab:

crontab -e

如果是第一次使用,系统会提示选择编辑器(选 vimnano)。
在文件末尾添加一行:

0 2 * * * /bin/bash /root/scripts/clean_logs.sh

这行含义:每天凌晨 2 点零分执行脚本。
保存退出。

检查定时任务是否添加成功:

crontab -l

应该能看到刚才添加的行。

验证定时任务是否生效

  1. 先手工执行一次脚本来测试脚本本身有没有问题:
/root/scripts/clean_logs.sh

如果没有报错,再用 df -h 查看磁盘空间是否释放。
如果占用没变化,可能是因为脚本没有覆盖到实际日志位置,或者日志文件的修改时间较新。

  1. 查看 cron 执行日志(Ubuntu/Debian 可能默认未开启 cron 日志,CentOS 通常有):
grep -i clean_logs /var/log/cron

如果看到类似 CMD (/bin/bash /root/scripts/clean_logs.sh) 的记录,说明定时器已触发。

避坑说明

坑1:权限不足
如果脚本使用非 root 用户运行,/var/log 可能无法访问。建议把脚本放在 root 的 crontab 里,或者用 sudo 加白名单。

坑2:误删重要日志
不要无脑删,先通过 find-ls 参数预览要删除的文件:

find /var/log -name "*.log" -type f -mtime +7 -ls

确认无误后再加入 -delete

坑3:日志还在增长,但删除后空间没变化
某些服务(如 Nginx)正在写入的日志文件即使被删除,文件句柄依然被占用,磁盘空间不会立刻释放。需要重启对应服务:

systemctl reload nginx

或者用 > /path/to/log 清空文件而不是删除。

高频问题解答

Q:我用了多个日志目录,脚本里只能写一行吗?
A:脚本里的数组 LOG_DIRS 已经支持多个目录,逗号分隔即可。

Q:设置完 crontab 后怎么确认明天凌晨能运行?
A:可以临时把时间调成下一分钟来测试(例如现在 15:30,就写 31 15 * * *),测试完记得改回实际时间。

Q:想保留最近 30 天的日志怎么改?
A:把 -mtime +7 改成 -mtime +30

Q:清理后磁盘依然满,还有什么可能?
A:检查 docker logs/tmp 目录、数据库 binlog 或用户上传目录。可以先用 du -sh /* 2>/dev/null | sort -hr | head -10 找到大文件位置。

---
如果你正在处理磁盘空间爆满自动清理日志定时任务,建议先按本文步骤完整执行,再根据自己的环境做微调;遇到异常时优先回看避坑和高频问题部分。配置一次,后续就能自动运行,不再担心日志撑爆硬盘。

分享到:
上一篇
数据库主从同步故障排查修复方案:数据库主从同步故障排查与修复
下一篇
多站点统一批量申请SSL证书宝塔脚本
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意