一键清理无用日志解决磁盘空间爆满
核心答案:清理无用日志解决磁盘爆满
Linux服务器磁盘空间被占满,最常见原因是系统日志(如syslog、messages)、应用日志(Nginx、MySQL)、历史归档文件(*.gz、*.old)持续增长未做清理。
使用一键清理脚本,可以安全删除超过设定天数的日志文件,快速释放GB级空间。
本文提供可直接执行的命令和脚本,并说明哪些日志必须保留、如何验证清理效果,避免误删关键数据。
哪些日志文件最容易吃空磁盘
- 系统日志:位于
/var/log/下,包括messages、syslog、secure、cron等,长时间不轮转会把磁盘写满。 - Web服务器日志:Nginx默认日志
/var/log/nginx/access.log和error.log;Apache类似目录,访问量大时每天生成数GB。 - 数据库日志:MySQL的
general_log、slow_query_log,以及MariaDB的日志,开启后增长极快。 - 应用与容器日志:Docker容器日志默认存储于
/var/lib/docker/containers/下的 json.log 文件,不限制大小会迅速吞掉磁盘。 - 历史归档文件:部分系统或应用会将旧日志压缩为
.gz或.old文件,累积后也占空间。
清理前必须做的两件事
- 确认磁盘占用情况
使用 df -h 查看各分区使用率,再用 du -sh /var/log/ 检查具体目录。
找出占用较高的日志路径。
- 备份重要日志(如安全审计日志
secure、登录记录wtmp)
如果担心误删,可以先将整个日志目录复制一份: cp -r /var/log /var/log_backup。
确认脚本无问题后再删除备份。
一键清理日志脚本与操作步骤
以下脚本会清理 /var/log/ 下 7 天前的所有 .log、.gz、.old 文件(不包含 wtmp、btmp、secure、lastlog 等系统关键文件)。
你可以根据需要调整天数或目录。
#!/bin/bash
# 一键清理无用日志(安全版)
LOG_DIRS=("/var/log" "/var/log/nginx" "/var/log/mysql")
DAYS=7 # 保留最近7天的日志
EXCLUDE_PATTERN="(wtmp|btmp|secure|lastlog|dmesg)"
for dir in "${LOG_DIRS[@]}"; do
if [ -d "$dir" ]; then
find "$dir" -type f \( -name "*.log" -o -name "*.gz" -o -name "*.old" \) -not -regex ".*\(${EXCLUDE_PATTERN}\)" -mtime +${DAYS} -delete
echo "已清理: $dir"
fi
done
echo "清理完成!"
操作步骤
- 将上述代码保存为
clean_logs.sh。 - 赋予执行权限:
chmod +x clean_logs.sh。 - 以root用户运行:
sudo bash clean_logs.sh。 - 脚本执行后会输出已清理的目录,没有报错即成功。
如果你只想快速查看有哪些文件可删(不删),将 -delete 改为 -print:
find /var/log -type f \( -name "*.log" -o -name "*.gz" \) -mtime +30 -print
清理后如何验证效果
- 查看磁盘空间:
df -h /var/log观察使用率是否下降。 - 确认关键日志仍在:检查
ls -l /var/log/secure /var/log/wtmp /var/log/lastlog是否存在且非空。 - 检查应用是否正常:访问网站或接口无误后,确认 Nginx/MySQL 日志仍在写入:
tail -f /var/log/nginx/access.log查看新记录。
如果空间释放不明显,可以针对 Docker 容器日志单独清理:
# 清理所有停止容器日志(谨慎使用)
docker container prune -f
truncate -s 0 /var/lib/docker/containers/*/*-json.log
注意:截断json.log会立即释放空间,但容器日志不会丢失最新输出。
常见问题与避坑说明
Q1:为什么清理后磁盘空间未释放?
有些日志文件正在被进程使用(如 access.log 被 Nginx 持续写入),delete 命令只会删除文件句柄,但进程仍占用空间。
重启相关服务或使用 truncate -s 0 文件名 清空内容即可。
Q2:误删了重要日志怎么办?
如果没有备份,可以尝试用 extundelete 恢复,但成功率不高。强烈建议清理前执行 cp -r /var/log /var/log_backup。
Q3:如何设置自动清理避免再次爆满?
将清理脚本加入 cron 定时任务:crontab -e 添加一行 0 3 * * 0 /path/to/clean_logs.sh(每周日凌晨3点执行)。
对于系统日志,还可以配置 logrotate 实现自动轮转。
Q4:一键清理脚本会删除正在使用的日志吗?
脚本使用 -mtime +7 仅删除修改时间7天前的文件,当前正在写入的日志是近期文件,不会被删除。
但已轮转的旧日志会被清理。
结语
磁盘爆满不必恐慌,通过本文的一键清理脚本和安全注意事项,你可以在几分钟内释放出数GB甚至数十GB空间。
建议先模拟运行(使用 -print)确认列表无误,再执行实际删除。
如果磁盘经常告警,最好配合配置 logrotate 或自动清理脚本来做长期维护。
同时,云服务器用户也可以关注泽御云(官网:https://www.zeyuyun.com)等正规服务商提供的磁盘扩容和运维支持服务。