上一篇 下一篇 分享链接 返回 返回顶部

宝塔磁盘爆满应急:脚本自动清理日志与临时文件

发布人: 发布时间:12小时前 阅读量:7

磁盘爆满为什么在宝塔面板上更常见

使用宝塔面板管理服务器时,磁盘写满是一个出现频率较高的运维问题。面板本身、网站程序、数据库、计划任务都会持续产生文件,如果缺少定期清理机制,磁盘使用率会在不知不觉中逼近 100%。常见原因包括:

  • 网站访问日志与错误日志长期未切割,单个文件可能达到数 GB;
  • Nginx、MySQL、PHP 等服务的日志按默认配置持续追加写入;
  • 临时目录(/tmp、/var/tmp)中残留的会话文件、上传分片、缓存文件;
  • 面板自身日志与计划任务输出文件堆积;
  • 数据库 binlog、慢查询日志未设置保留周期;
  • 程序异常导致的重复备份包或崩溃转储文件。

磁盘写满后,MySQL 可能无法写入而拒绝连接,Nginx 无法写日志导致请求失败,面板也可能出现无法登录或操作报错的情况,因此需要先应急腾出空间,再排查根因。

应急处理思路:先保命,再清理,最后加固

不建议一上来就执行大范围删除命令。合理的顺序是:

  1. 定位占用:确认是哪个分区满、哪个目录占用最多;
  2. 清出最小可用空间:优先清理可再生的日志和临时文件;
  3. 恢复服务:重启因磁盘满而异常的服务进程;
  4. 建立自动清理:用脚本 + 计划任务形成长效机制。

第一步:快速定位磁盘占用

通过 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 只清理较旧文件,保留近期日志便于排障;
  • 目录不存在时直接跳过,脚本可重复执行;
  • 结尾输出磁盘使用情况,便于通过计划任务日志观察效果。

在宝塔面板中配置计划任务

  1. 将脚本保存为 /www/server/panel/script/disk_clean.sh,并赋予执行权限:chmod +x /www/server/panel/script/disk_clean.sh
  2. 先手动执行一次,确认无报错、无误删,可临时把 -delete 换成 -print 做空跑验证;
  3. 进入面板「计划任务」,任务类型选择 Shell 脚本,执行周期建议每日凌晨业务低峰期;
  4. 开启日志记录,定期查看任务输出,确认清理量与磁盘水位变化。

自动清理之外的必要加固

脚本只能解决“已经写满”的问题,真正降低风险还需要从源头控制:

  • 配置日志轮转:为 Nginx、MySQL 等服务设置 logrotate 策略,按大小或时间切割并压缩;
  • 限制 binlog 保留:设置合理的过期时间,避免 binlog 无限增长;
  • 监控磁盘水位:在面板或第三方监控中设置阈值告警,例如 80% 预警、90% 严重告警;
  • 分离数据盘:将数据库、网站上传目录、备份目录放到独立数据盘,避免与系统盘互相挤占;
  • 备份策略:本地保留少量备份,异地或对象存储保存长期版本,避免备份包把磁盘塞满。

常见风险提示

  • 清理前尽量确认文件用途,尤其要区分“日志”和“数据”;
  • 不要在业务高峰期执行大规模删除,避免 IO 抖动影响服务;
  • 使用 rm -rf 时务必核对路径,变量为空时应加保护判断;
  • 删除已打开的文件后,若空间未释放,检查进程句柄并重启对应服务;
  • 任何自动化脚本都建议先在小范围或测试环境验证。

磁盘爆满多是长期积累的结果,应急脚本负责快速恢复可用空间,日志轮转、容量监控与合理的目录规划才是避免复发的关键。建议把清理脚本与监控告警配合使用,让服务器始终留有安全余量。

目录结构
全文
企业微信 企业微信
微信公众号 微信公众号
服务热线: 400-790-1688
电子邮箱: 3310008520@qq.com