宝塔磁盘爆满应急:脚本自动清理日志与临时文件
磁盘爆满为什么在宝塔面板上更常见
使用宝塔面板管理服务器时,磁盘写满是一个出现频率较高的运维问题。面板本身、网站程序、数据库、计划任务都会持续产生文件,如果缺少定期清理机制,磁盘使用率会在不知不觉中逼近 100%。常见原因包括:
- 网站访问日志与错误日志长期未切割,单个文件可能达到数 GB;
- Nginx、MySQL、PHP 等服务的日志按默认配置持续追加写入;
- 临时目录(/tmp、/var/tmp)中残留的会话文件、上传分片、缓存文件;
- 面板自身日志与计划任务输出文件堆积;
- 数据库 binlog、慢查询日志未设置保留周期;
- 程序异常导致的重复备份包或崩溃转储文件。
磁盘写满后,MySQL 可能无法写入而拒绝连接,Nginx 无法写日志导致请求失败,面板也可能出现无法登录或操作报错的情况,因此需要先应急腾出空间,再排查根因。
应急处理思路:先保命,再清理,最后加固
不建议一上来就执行大范围删除命令。合理的顺序是:
- 定位占用:确认是哪个分区满、哪个目录占用最多;
- 清出最小可用空间:优先清理可再生的日志和临时文件;
- 恢复服务:重启因磁盘满而异常的服务进程;
- 建立自动清理:用脚本 + 计划任务形成长效机制。
第一步:快速定位磁盘占用
通过 SSH 登录服务器后,可依次执行以下命令(只读操作,不会修改文件):
df -h:查看各分区使用率,确认是系统盘还是数据盘写满;du -sh /* 2>/dev/null | sort -rh | head -20:定位顶层大目录;du -sh /www/* 2>/dev/null | sort -rh | head -20:宝塔环境重点关注 /www 目录;find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null:找出超大文件;lsof | grep -i deleted:检查是否有已被删除但句柄未释放的文件,这种情况需要重启对应进程才能真正释放空间。
第二步:手动清理高风险但可再生的文件
以下内容通常可以安全清理,但执行前仍建议确认业务是否依赖:
- 网站访问日志:可直接截断而非删除,避免影响正在写入日志的进程,例如
truncate -s 0 /www/wwwlogs/*.log; - /tmp 与 /var/tmp:删除长期未修改的临时文件,注意不要清理正在运行程序的活动文件;
- 面板日志:/www/server/panel/logs 下的历史日志;
- 包管理器缓存:yum、apt 的缓存目录;
- 旧备份包:确认已有异地备份后再删除本地历史备份。
注意:不要直接删除 MySQL 数据目录、网站根目录下的上传目录或 .user.ini 等关键文件,误删可能造成数据不可恢复。
编写自动清理脚本
应急清理之后,建议把清理动作脚本化,交给宝塔的计划任务定时执行。下面给出一个通用示例,逻辑清晰、只做白名单清理,可根据实际情况调整路径与天数。
脚本内容示例
#!/bin/bash
# 宝塔磁盘应急清理脚本(示例,请按实际环境调整)
# 建议以 root 执行,先加 dry-run 验证再正式启用
LOG_DIRS="/www/wwwlogs /www/server/panel/logs /var/log"
TMP_DIRS="/tmp /var/tmp"
KEEP_DAYS_LOG=7
KEEP_DAYS_TMP=3
for d in $LOG_DIRS; do
[ -d "$d" ] || continue
find "$d" -type f -name "*.log" -mtime +$KEEP_DAYS_LOG -exec truncate -s 0 {} \;
done
for d in $TMP_DIRS; do
[ -d "$d" ] || continue
find "$d" -type f -mtime +$KEEP_DAYS_TMP -delete
done
# 清理系统包管理器缓存(视发行版选择)
command -v yum >/dev/null && yum clean all >/dev/null 2>&1
command -v apt-get >/dev/null && apt-get clean >/dev/null 2>&1
echo "[$(date '+%F %T')] cleanup done, disk usage:"
df -h | grep -E '^/dev/'
脚本中的关键点:
- 使用
truncate -s 0而不是rm,可以让正在写日志的进程继续持有文件句柄,避免日志丢失或服务报错; - 使用
-mtime +N只清理较旧文件,保留近期日志便于排障; - 目录不存在时直接跳过,脚本可重复执行;
- 结尾输出磁盘使用情况,便于通过计划任务日志观察效果。
在宝塔面板中配置计划任务
- 将脚本保存为
/www/server/panel/script/disk_clean.sh,并赋予执行权限:chmod +x /www/server/panel/script/disk_clean.sh; - 先手动执行一次,确认无报错、无误删,可临时把
-delete换成-print做空跑验证; - 进入面板「计划任务」,任务类型选择 Shell 脚本,执行周期建议每日凌晨业务低峰期;
- 开启日志记录,定期查看任务输出,确认清理量与磁盘水位变化。
自动清理之外的必要加固
脚本只能解决“已经写满”的问题,真正降低风险还需要从源头控制:
- 配置日志轮转:为 Nginx、MySQL 等服务设置 logrotate 策略,按大小或时间切割并压缩;
- 限制 binlog 保留:设置合理的过期时间,避免 binlog 无限增长;
- 监控磁盘水位:在面板或第三方监控中设置阈值告警,例如 80% 预警、90% 严重告警;
- 分离数据盘:将数据库、网站上传目录、备份目录放到独立数据盘,避免与系统盘互相挤占;
- 备份策略:本地保留少量备份,异地或对象存储保存长期版本,避免备份包把磁盘塞满。
常见风险提示
- 清理前尽量确认文件用途,尤其要区分“日志”和“数据”;
- 不要在业务高峰期执行大规模删除,避免 IO 抖动影响服务;
- 使用
rm -rf时务必核对路径,变量为空时应加保护判断; - 删除已打开的文件后,若空间未释放,检查进程句柄并重启对应服务;
- 任何自动化脚本都建议先在小范围或测试环境验证。
磁盘爆满多是长期积累的结果,应急脚本负责快速恢复可用空间,日志轮转、容量监控与合理的目录规划才是避免复发的关键。建议把清理脚本与监控告警配合使用,让服务器始终留有安全余量。