宝塔面板磁盘爆满排查与清理全记录
前言
前几天登录宝塔面板,发现磁盘空间告急(日志文件都清理了,怎么磁盘占用率还这么高):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/sitepanel目录占了 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可以关闭面板自动备份。但是:
版本差异:不同宝塔版本的菜单编号可能不同
状态不一致:部分面板版本中,这个开关可能已经失效或未生效
如果bt命令能解决问题,当然最省事。但当它失效时,就需要手动排查 crontab。
一套通用的任务排查逻辑
先看表象:
crontab -l看看有哪些定时任务找关键词:根据要排查的问题,推测可能的代码关键词(如
backup、panel、zip、clean等)反向搜索:
grep -l "关键词" /path/to/scripts/*读脚本确认:
cat出来看前几行,通常能定位用途判断能否操作:确认不是核心任务(如 SSL、系统更新、面板心跳)后再处理
一个实用的简化方法
如果你不想深入排查,可以直接保留备份任务,但加上自动清理逻辑:
# 添加一个每天清理 7 天前备份的计划任务 echo "0 3 * * * find /www/backup/panel/ -name '*.zip' -mtime +7 -delete" >> /var/spool/cron/root这样做的好处是:
不需要找到并关闭原任务
备份继续运行,但不会无限堆积
风险低,不影响其他功能
经验总结
定期检查磁盘占用:用
du -sh /* --exclude=proc可以快速定位大目录。备份是好习惯,但必须配套清理策略:只开备份不设保留份数,迟早会撑爆磁盘。
/www/backup/panel目录值得重点关注:它会每天生成 300MB+ 的压缩包,半年不管就是 50GB+。crontab 中的加密任务不要乱删:需要先
cat确认内容,可能是 SSL 续期等核心任务。关键词搜索 + 读脚本头几行:这是排查宝塔加密任务最有效的方法。
如果找不到源头,可以用清理脚本兜底:不必非要关闭原任务。
写在最后
这次排查的核心思路可以概括为:从现象倒推可能的原因,层层深入定位,找到根源后选择最合适的处理方案。
对于定时任务的排查,重点是不盲目删除,而是通过关键词搜索、读脚本内容来准确判断每个任务的职责,再做决定。
如果你也遇到类似问题,不妨先从/www/backup/panel看起——说不定答案就在那里。
