磁盘空间爆满自动清理日志定时任务
为何日志会占满磁盘?
很多新手服务器运维者都会遇到类似情况:网站运行正常,但突然 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
如果是第一次使用,系统会提示选择编辑器(选 vim 或 nano)。
在文件末尾添加一行:
0 2 * * * /bin/bash /root/scripts/clean_logs.sh
这行含义:每天凌晨 2 点零分执行脚本。
保存退出。
检查定时任务是否添加成功:
crontab -l
应该能看到刚才添加的行。
验证定时任务是否生效
- 先手工执行一次脚本来测试脚本本身有没有问题:
/root/scripts/clean_logs.sh
如果没有报错,再用 df -h 查看磁盘空间是否释放。
如果占用没变化,可能是因为脚本没有覆盖到实际日志位置,或者日志文件的修改时间较新。
- 查看 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 找到大文件位置。
---
如果你正在处理磁盘空间爆满自动清理日志定时任务,建议先按本文步骤完整执行,再根据自己的环境做微调;遇到异常时优先回看避坑和高频问题部分。配置一次,后续就能自动运行,不再担心日志撑爆硬盘。