磁盘空间爆满一键清理无用日志脚本
为什么日志会撑爆磁盘空间?
服务器运行久了,系统日志(如 /var/log)、应用日志(如 Nginx、MySQL 日志)和临时文件会不断堆积。
如果不定期清理,很容易出现 磁盘空间爆满,导致服务无法写入数据。
手动逐个删除太麻烦,而且新手容易误删重要文件。
本文提供一个安全、可带参数的一键清理 Shell 脚本,你只需复制保存、赋予权限就能运行,适合 CentOS / Ubuntu 等主流 Linux 系统。
---
准备工作:先查看当前磁盘占用
在运行任何清理之前,先用以下命令确认哪些目录占用了大量空间:
df -h # 查看各分区总体使用率
du -sh /var/log # 检查日志目录具体大小
重点关注 /var/log、/tmp、/var/cache 等目录。
如果某个日志目录超过几 GB,就可以用我们的脚本来清理。
---
编写一键清理无用日志脚本
创建一个脚本文件 clean_logs.sh:
vim clean_logs.sh
粘贴以下内容(请根据实际环境微调目录和保留天数):
#!/bin/bash
# 一键清理无用日志和临时文件
# 安全模式:默认只列出待删除文件,加 --run 参数才真正删除
LOG_DIRS=(
"/var/log"
"/var/cache"
)
EXPIRE_DAYS=3 # 保留最近3天的日志
if [ "$1" == "--run" ]; then
ACTION="delete"
else
ACTION="list"
fi
echo "扫描待清理文件..."
for dir in "${LOG_DIRS[@]}"; do
if [ -d "$dir" ]; then
if [ "$ACTION" == "list" ]; then
find "$dir" -type f -name "*.log" -mtime +$EXPIRE_DAYS 2>/dev/null
else
find "$dir" -type f -name "*.log" -mtime +$EXPIRE_DAYS -exec rm -f {} \; 2>/dev/null
echo "已清理 $dir 中超过 $EXPIRE_DAYS 天的日志"
fi
fi
done
# 清理临时文件(超过2天未使用的临时文件)
if [ "$ACTION" == "delete" ]; then
find /tmp -type f -atime +2 -delete 2>/dev/null
echo "已清理 /tmp 中超过2天未访问的文件"
fi
if [ "$ACTION" == "list" ]; then
echo "以上是待清理文件列表(共 ${#files[@]} 个)。如需真正删除,请执行:bash clean_logs.sh --run"
else
echo "清理完成"
fi
说明:脚本默认先预览(只列出不删除),确保无误后再加 --run 实际执行。这种设计可以防止新手误删重要日志。
保存退出后,赋予执行权限:
chmod +x clean_logs.sh
---
执行脚本并设置定时任务
先模拟运行,查看会清理哪些文件:
./clean_logs.sh
确认没有问题后,真正执行清理:
./clean_logs.sh --run
如果你希望每周自动运行一次,可以添加到 crontab:
crontab -e
添加以下行(每周日凌晨3点执行):
0 3 * * 0 /path/to/clean_logs.sh --run >> /var/log/clean_logs.log 2>&1
---
避坑指南(新手必读)
- 不要用
rm -rf /var/log:直接删除整个日志目录可能导致日志系统报错。我们只删除超过保留天数的.log文件,不动目录结构。 - 先预览再执行:第一次运行时务必先用不带参数的脚本预览,确认不会误删正在写入的日志。
- 保留天数根据需求调整:对于审计要求严格的业务,建议保留30天;一般服务器保留3-7天即可。
- 日志被占用无法删除:如果某个日志正在被进程写入,
rm会成功但磁盘空间不会立即释放。需要先systemctl restart rsyslog或重启对应服务。 - 不要清理
/var/log/wtmp、/var/log/btmp等特殊日志:这些文件记录了系统登录历史,通常应保留。我们的脚本只清理*.log,不会误删它们。
---
效果验证:对比清理前后的磁盘占用
清理前后建议分别执行 df -h 对比,例如:
df -h
观察 / 分区的 已用 和 可用 数值。
如果从 98% 降到了 50%,说明脚本生效了。
更详细的验证可以用:
du -sh /var/log # 再次查看日志目录大小
---
常见问题(FAQ)
Q:运行脚本提示 Permission denied?
A:记得先 chmod +x clean_logs.sh,或者用 bash clean_logs.sh 直接执行。
Q:我能不能一次性删除所有日志而不保留天数?
A:不建议。至少保留最近几天的日志,方便排查近期故障。你可以将 EXPIRE_DAYS 改为 0,但请谨慎。
Q:清理后空间没有明显减少?
A:查看是否还有磁盘占用大户(如 Docker 镜像、核心转储文件)。日志清理只是第一步,其他文件可能需要额外处理。
---
结语
通过这个一键清理脚本,你可以快速安全地释放被日志撑爆的磁盘空间。
关键是先预览再删除,并设置自动定时任务,让服务器永远保持干净。
如果你正在排查磁盘占满问题,建议先按本文步骤操作一遍,再根据自身环境微调脚本中的目录和保留天数。
遇到异常时请回看避坑指南部分。