删完文件磁盘空间不降主因是文件被进程占用未释放,其次为回收站未清空、.user.ini被chattr +i锁定、sqlite数据库未vacuum或wsl2兼容问题。

删完文件磁盘空间不降,90% 是因为文件被进程锁着没真正释放,剩下 10% 是回收站没清干净、.user.ini 被 chattr +i 锁死、SQLite 数据库没 vacuum,或 WSL2 兼容问题。
回收站目录 /www/Recycle_bin 是否真清空了
宝塔点“清空回收站”只是调用一次 rm -rf,但若里面存在被锁定的文件(比如带 i 属性的 .user.ini),命令会静默失败,目录实际还是满的。
- 先检查:执行
ls -A /www/Recycle_bin,输出非空就说明根本没清掉 - 再确认有没有不可变文件:进目录后运行
lsattr .user.ini 2>/dev/null,如果结果里含字母i,就得先解锁 - 批量解除锁定:
chattr -i .user.ini 2>/dev/null || true(加|| true防止个别文件不存在中断) - 最后删:
rm -rf /www/Recycle_bin/*,再ls -A /www/Recycle_bin验证为空
有没有进程还在打开已删文件(lsof 找 deleted)
Linux 下文件被 rm 后,只要还有进程持有它的文件描述符,磁盘块就不会回收——lsof | grep deleted 就是专抓这类“幽灵占用”的命令。
- 执行
lsof | grep deleted,典型输出像:nginx 1234 root 6u REG 8,1 1073741824 123456 /www/wwwroot/site.com/access.log (deleted) - 直接杀掉所有相关进程:
lsof | grep deleted | awk '{print $2}' | sort -u | xargs kill -9 - 重点服务要手动重启:
systemctl restart nginx mysql php-fpm,否则日志句柄可能重建失败 - 注意:某些进程以非 root 用户启动,
lsof默认看不到,加sudo lsof更全
宝塔自己的 SQLite 数据库 default.db 没 vacuum
你删了站点、备份、日志,面板 UI 显示删除成功,但 /www/server/panel/data/default.db 文件体积纹丝不动——这是 SQLite 的设计机制:删数据只标记空间可复用,不自动收缩文件。
- 连数据库:
sqlite3 /www/server/panel/data/default.db - 执行收缩:
VACUUM;(注意分号,不然不生效) - 退出:
.quit - 对比前后大小:
du -h /www/server/panel/data/default.db,常能省下几百 MB 到几 GB - 这个步骤最容易跳过,尤其当
df -h显示根分区 98%,但du -sh /www总和才 70GB 时,基本就是它卡着
WSL2 环境下回收站清理失败的硬伤
在 WSL2 的 Ubuntu 里装宝塔,/www/Recycle_bin 路径存在,但 rm -rf 常报 Operation not permitted,这不是权限问题,是 WSL2 对 chattr 和部分 inode 操作支持不完整。
- 临时应对:用
cp /dev/null > /www/Recycle_bin/bigfile.log截断大文件,再rm,比硬删稳 - 别信“改权限能解决”,官方文档从 2025 年 6 月起已明确标注“不推荐 WSL2 部署生产环境宝塔”
- 长期方案只有两个:换 VirtualBox/VMware,或直接上云服务器——别在 WSL2 上赌兼容性
最麻烦的不是某一步做错,而是多个问题叠加:回收站里有被 i 锁住的 .user.ini,同时 nginx 正开着某个已被删的日志,而 default.db 又三年没 VACUUM。得一层层剥,漏掉任何一环,空间都回不来。











