定时清理磁盘日志防止站点磁盘空间爆满
先看看你的磁盘还剩多少空间
在日常运维中,“磁盘爆满”是导致网站无法正常访问、数据库写入失败、后台登录卡顿的常见原因之一,而日志文件往往是无声的“磁盘杀手”。
很多新手装了站点后很少去检查磁盘使用率,直到突然发现网站打不开,通过 df -h 命令一看,/ 或 /var 分区占用已 100%。
运行下面这条命令,就能看到各分区的使用百分比:
df -h
重点关注挂载点为 / 或 /home 的行。
如果 Use% 超过 80%,说明该动手了。
随后要找出到底是什么日志在“吃空间”。
定位最占空间的日志文件
常见日志存放路径有:
/var/log/– 系统日志(如messages、syslog、secure)- 如果使用 Nginx,日志通常在
/var/log/nginx/或站点目录下的log/文件夹 - 如果使用 MySQL,日志可能在
/var/log/mysql/或/var/lib/mysql/(binlog) - 面板类如宝塔,日志一般在
/www/wwwlogs/
可以先用 du 命令快速按目录大小排序:
du -sh /var/log/* /www/wwwlogs/* 2>/dev/null | sort -rh | head -20
这条命令会把所有日志目录按大小从大到小排好,一眼就能看出哪些文件最占空间。
编写一个自动清理脚本
找到占空间的日志后,不要手动去“删文件”,因为很多服务(如 Nginx、MySQL)在运行时不会立刻释放已删除文件的磁盘空间,可能导致服务异常。
正确的做法是用截断(truncate)或按日期清理。
创建一个脚本文件(比如 /root/clean_logs.sh),内容如下:
#!/bin/bash
# 清理超过 7 天的旧日志文件,保留最新日志
# 注意:只清理已轮转的 .log.* 文件,不直接删除当前正在写入的 .log
LOG_DIRS=("/var/log" "/www/wwwlogs")
for dir in "${LOG_DIRS[@]}"; do
if [ -d "$dir" ]; then
find "$dir" -type f -name "*.log.*" -mtime +7 -exec rm -f {} \;
fi
done
# 如果某些日志达到指定大小,也可以直接截断
# truncate -s 0 /var/log/nginx/access.log 按需启用
注意:-mtime +7 表示修改时间超过 7 天的文件,
只匹配 *.log.*(例如 access.log.1 error.log.20250325.gz),
不会动正在写的 access.log 本身。
保存后,给脚本执行权限:
chmod +x /root/clean_logs.sh
设置定时任务自动运行
使用 crontab 让脚本每天凌晨自动执行一次。
执行以下命令进入编辑模式:
crontab -e
在文件末尾添加一行:
0 3 * * * /root/clean_logs.sh > /dev/null 2>&1
解释:0 3 * * * 表示每天凌晨 3 点执行。> /dev/null 2>&1 表示不产生输出日志,避免重复写邮件。
保存退出(若用 nano 按 Ctrl+O 回车,Ctrl+X;
若用 vim 按 :wq 回车)。
检查定时任务是否生效:
crontab -l
避坑与常见问题
不要直接删除系统关键日志
像 /var/log/secure(登录日志)、/var/log/messages(系统消息)这些文件,如果直接删除会导致服务重新启动后无法写入。
正确做法是使用 logrotate 进行轮转和压缩,而不是手动删除。
如果你的系统已经配置了 logrotate,一般只需检查配置,不用额外操作。
为什么清理后磁盘空间没释放?
如果某个日志文件正在被服务占用(比如 Nginx 正在写入),使用 rm -f 删除后,磁盘空间不会立刻释放,必须重启服务或使用 truncate 命令。
脚本中我们匹配的是 *.log.* 这类历史文件,当前日志不受影响,所以不会有这个问题。
如果我是宝塔面板用户
宝塔面板自带一个“计划任务”功能,你可以在后台添加一个 Shell 脚本任务,粘贴上面的清理脚本内容,设置每天执行一次,效果一样。
验证自动清理是否生效
手动执行一次脚本:
bash /root/clean_logs.sh
再用 df -h 对比前后磁盘使用率是否下降。
如果没有变化,检查脚本中的目录是否存在,或者日志文件命名是否匹配 *.log.* 模式。
你可以先运行 find /var/log -type f -name '*.log.*' 来确认确实有这类文件。
提示:第一次使用建议把-mtime +7改成-mtime +0进行测试,确认无误后再改回 7 天。
总结
通过本文的步骤,你已经学会了如何查看磁盘占用、识别占用空间大的日志、编写安全清理脚本并设置定时任务。定时清理磁盘日志防止站点磁盘空间爆满不再是一个难题。
如果你在操作过程中遇到任何异常,优先回到“避坑”部分检查是否触碰了系统日志红线,或者确认脚本权限和路径是否正确。