宝塔面板磁盘爆满排查与清理全记录
2026/5/12 15:18:15 网站建设 项目流程

前言

前几天登录宝塔面板,发现磁盘空间告急(日志文件都清理了,怎么磁盘占用率还这么高):81.52G / 98.3G,剩余不足 17%。虽然服务器负载不高,但这个磁盘占用率让人隐隐不安——如果不及时处理,数据库写入失败、网站无法上传、面板报错等问题随时可能找上门。

于是,我开始了这次磁盘清理之旅。整个过程比想象中曲折,也意外发现了一个坑。记录下来,希望对遇到类似问题的朋友有所帮助。

第一步:定位元凶

SSH 登录服务器,执行du -sh /www/* | sort -rh | head -20,结果一目了然:

41G /www/backup 27G /www/server 1.9G /www/wwwlogs 1.2G /www/wwwroot

问题很清晰:/www/backup占了 41GB,是总磁盘占用的一半。显然,备份目录出了问题。

第二步:深入备份目录

执行du -sh /www/backup/*,结果让人一惊:

938M /www/backup/database 39G /www/backup/panel ← 罪魁祸首 909M /www/backup/site

panel目录占了 39GB。这是宝塔面板的配置备份目录,正常情况下只有几十 MB,显然异常膨胀了。

第三步:查看 panel 目录内容

执行ls -lh /www/backup/panel/,真相大白:

-rw--- 1 root root 346M Jan 17 00:16 2026-01-17.zip -rw--- 1 root root 346M Jan 18 00:15 2026-01-18.zip ... -rw--- 1 root root 362M Mar 3 00:37 2026-03-03.zip

从 1 月 17 日到 3 月 3 日,每天一个 350MB+ 的压缩包,累积了约 110 个文件。宝塔面板的自动备份功能一直在默默运行,却从未清理过旧文件。

第四步:清理与解决

立即释放空间

rm -f /www/backup/panel/*.zip

执行后,磁盘从 81GB 降至 40GB 左右,空间立刻释放。

长效方案:设置自动清理

与其强行关闭备份,不如设置自动清理规则。在宝塔面板的「计划任务」中添加:

  • 任务类型:Shell 脚本

  • 执行周期:每天 凌晨 3:00

  • 脚本内容:

    find /www/backup/panel/ -name "*.zip" -mtime +7 -delete

这样每天自动删除 7 天前的备份,既能保留最近的安全回滚点,又不会让磁盘再次爆满。

附:任务排查逻辑解析

有朋友问:为什么要查crontab?那些加密名字的任务是怎么排查的?

这里单独展开讲讲,如何排查服务器上的定时任务

为什么要查定时任务?

清理完 39GB 旧文件后,如果不关闭自动备份,明天又会生成一个新的 360MB 压缩包。虽然有了自动清理脚本(每天删 7 天前的)可以兜底,但更好的做法是先搞清楚:这个备份是谁创建的?还会不会继续写?

所以需要排查宝塔面板的定时任务系统。

任务排查的完整思路

第一步:查看当前用户的定时任务列表
crontab -l

这个命令会列出当前用户(通常是root)的所有定时任务。我们当时看到的输出是:

10 * * * * /www/server/cron/3ab48c27ec99cb9787749c362afae517 >> /www/server/cron/...log 2>&1 02 * * * * /www/server/cron/46a3ddacac2d541df7368f077287b174 >> /www/server/cron/...log *1 * * * * /www/server/cron/6f019627a35217391176398968f8afa7 >> /www/server/cron/...log ...(共 10 条)

观察要点

  • 所有任务都指向/www/server/cron/目录下的文件

  • 文件名都是无意义的 32 位随机字符串

  • 每条任务都带日志重定向>>...log

这是宝塔面板的常见做法:将具体逻辑封装到脚本文件中,然后用随机命名隐藏任务的真实用途。这样做可以防止用户误删或被篡改,但也给排查带来了困难。

第二步:用关键词搜索任务脚本内容

因为无法从任务名看出用途,需要直接搜索脚本内容。

grep -l "panel" /www/server/cron/*
  • -l:只输出包含关键词的文件名,不输出匹配行内容

  • "panel":搜索面板相关的关键字

搜索结果:

/www/server/cron/3ab48c27ec99cb9787749c362afae517 /www/server/cron/3ab48c27ec99cb9787749c362afaa517.log /www/server/cron/46a3ddacac2d541df7368f077287b174

找到了 3 个包含panel的文件。其中.log是日志文件,可以忽略,重点关注另外两个脚本文件。

第三步:查看脚本内容确认用途
cat /www/server/cron/3ab48c27ec99cb9787749c362afae517

输出内容:

#!/bin/bash PATH=... export PATH echo $$ > /www/server/cron/3ab48c27ec99cb9787749c362afae517.pl /www/server/panel/pyenv/bin/python3 -u /www/server/panel/class/acme_v2.py --renew=1 echo "---" ... rm -f /www/server/cron/3ab48c27ec99cb9787749c362afae517.pl

关键识别点acme_v2.py --renew=1

这是一个Let's Encrypt SSL 证书自动续期任务,不是面板备份。不能删除,否则网站 HTTPS 证书到期后不会自动续期。

第四步:扩展搜索范围

如果panel没搜到想要的目标,可以换其他关键词:

# 搜索备份相关的关键词 grep -l "backup" /www/server/cron/* # 搜索 zip 压缩相关的(面板备份会打包成 .zip) grep -l "\.zip" /www/server/cron/* # 查看所有非日志脚本的头几行 for f in /www/server/cron/*; do if [ -f "$f" ] && ! echo "$f" | grep -q "\.log$"; then echo "===== $f =====" head -5 "$f" fi done

为什么没用bt命令?

宝塔官方提供了bt命令行工具,理论上输入18可以关闭面板自动备份。但是:

  1. 版本差异:不同宝塔版本的菜单编号可能不同

  2. 状态不一致:部分面板版本中,这个开关可能已经失效或未生效

如果bt命令能解决问题,当然最省事。但当它失效时,就需要手动排查 crontab。

一套通用的任务排查逻辑

  1. 先看表象crontab -l看看有哪些定时任务

  2. 找关键词:根据要排查的问题,推测可能的代码关键词(如backuppanelzipclean等)

  3. 反向搜索grep -l "关键词" /path/to/scripts/*

  4. 读脚本确认cat出来看前几行,通常能定位用途

  5. 判断能否操作:确认不是核心任务(如 SSL、系统更新、面板心跳)后再处理

一个实用的简化方法

如果你不想深入排查,可以直接保留备份任务,但加上自动清理逻辑

# 添加一个每天清理 7 天前备份的计划任务 echo "0 3 * * * find /www/backup/panel/ -name '*.zip' -mtime +7 -delete" >> /var/spool/cron/root

这样做的好处是:

  • 不需要找到并关闭原任务

  • 备份继续运行,但不会无限堆积

  • 风险低,不影响其他功能

经验总结

  1. 定期检查磁盘占用:用du -sh /* --exclude=proc可以快速定位大目录。

  2. 备份是好习惯,但必须配套清理策略:只开备份不设保留份数,迟早会撑爆磁盘。

  3. /www/backup/panel目录值得重点关注:它会每天生成 300MB+ 的压缩包,半年不管就是 50GB+。

  4. crontab 中的加密任务不要乱删:需要先cat确认内容,可能是 SSL 续期等核心任务。

  5. 关键词搜索 + 读脚本头几行:这是排查宝塔加密任务最有效的方法。

  6. 如果找不到源头,可以用清理脚本兜底:不必非要关闭原任务。

写在最后

这次排查的核心思路可以概括为:从现象倒推可能的原因,层层深入定位,找到根源后选择最合适的处理方案

对于定时任务的排查,重点是不盲目删除,而是通过关键词搜索、读脚本内容来准确判断每个任务的职责,再做决定。

如果你也遇到类似问题,不妨先从/www/backup/panel看起——说不定答案就在那里。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询