1. 首页 > 技术教程 > 正文

VPS 磁盘空间突然满了怎么办?AI Agent 自动定位大文件和日志目录

VPS 磁盘空间突然报警,SSH 登录受阻或者 Docker 容器频繁重启,这是运维中最常见的噩梦。别急着加硬盘扩容,很多时候只是日志狂写或者临时文件堆积。在主机选的实战经验里,利用 AI Agent 辅助排查能比传统命令快几倍定位问题根源。本文教你结合传统运维命令和 AI 自动化手段,快速清理空间,恢复服务稳定。

zhujixuan TASK 192

传统命令快速排查 VPS 磁盘占用

遇到空间满,第一步不是乱删文件,而是看清楚是谁占用了空间。先用 `df -h` 查看挂载点使用情况,确认是根目录 `/` 爆了,还是 `/var` 或 `/home` 单独爆了。

如果根目录满了,用以下命令快速定位占用 Top 10 的大目录:

du -h –max-depth=1 / 2>/dev/null | sort -hr | head -n 10

这条命令会列出根目录下一级文件夹的大小并排序。通常“凶手”都藏在 `/var`(日志)、`/home`(用户数据)或 `/var/lib/docker`(镜像层)里。如果 `/var` 最大,继续深入:

du -h –max-depth=1 /var 2>/dev/null | sort -hr | head -n 10

AI Agent 辅助定位大文件和日志目录

手动敲命令排查适合老手,但如果你维护的服务器较多,或者想快速分析复杂的目录结构,可以利用 AI Agent 来辅助。这里介绍两种实战场景:使用终端内的 AI 助手(如 Claude Code)和使用自动化工作流(如 n8n)。

使用 Claude Code 进行智能分析

Claude Code 是能直接在终端读写文件、执行命令的 AI Agent。当你面对一堆杂乱的 `du` 输出时,可以直接把输出贴给它,或者让它写脚本。

实战 Prompt:
“当前 VPS 根目录空间已满,请帮我分析 `/var/log` 目录下所有超过 100MB 的文件,并给出安全的清理命令。注意:不要删除正在被进程写入的关键日志文件。”

Claude Code 会自动生成类似 `find /var/log -type f -size +100M -exec ls -lh {} \;` 的命令,并帮你识别哪些是 `nginx.log`、`journal.log` 等常见可清理对象,甚至帮你写好清理脚本。

利用 n8n 构建磁盘监控 Agent

如果你部署了 n8n,可以构建一个自动化工作流,定时检查磁盘空间。

1.SSH 节点:执行 `df -h | grep -vE '^Filesystem|tmpfs|cdrom'`。
2.Code 节点:解析输出,计算 Use% 数值。设定阈值,比如超过 85%。
3.AI Agent 节点(如 OpenAI Model):如果触发阈值,将 `du -sh /*` 的结果传给 AI,让它生成一段故障报告和建议清理的路径。
4.Webhook 或 邮件节点:发送报告给管理员。

这种方式不需要你一直盯着屏幕,AI Agent 会充当“运维助手”的角色,把最关键的信息提炼出来。

常见的大文件“凶手”与清理方案

定位到具体文件后,清理要谨慎。以下是 VPS 上最常见的三个占用大户。

Docker 悬空镜像与容器清理

跑 AI 应用(如 Ollama、Stable Diffusion)或者 Web 服务,Docker 很容易产生垃圾。未使用的镜像、停止的容器和未使用的卷都会占用空间。

一键清理命令(慎用):

docker system prune -a –volumes -f

这个命令会删除所有停止的容器、所有未被使用的网络、所有悬空镜像以及所有未使用的构建缓存。加上 `-a` 会删除所有没有使用的镜像(不仅仅是悬空镜像),加上 `–volumes` 会清理卷。

如果只想清理悬空镜像(dangling images,即 `<none>` 标签的),安全一点:

docker image prune -f

Nginx 日志与系统日志轮转

Web 服务器如果不做日志切割,`access.log` 动辄几十 GB。直接用 `rm` 删除日志文件有时不会释放空间(因为进程还占用着文件句柄),正确做法是清空文件:

echo > /var/log/nginx/access.log
truncate -s 0 /var/log/nginx/access.log

对于 systemd 的日志(`/var/log/journal`),可以使用 `journalctl` 清理:

journalctl –vacuum-time=1d
journalctl –vacuum-size=500M

AI 模型缓存与临时文件

如果你在本地部署了大语言模型,模型文件本身就很大(几个 GB 到几十 GB)。检查 `~/.cache/huggingface` 或者 Ollama 的默认模型存储路径。如果是下载失败的临时文件残留,可以直接删除。但模型本体文件删除前务必确认是否还需要用,下载回来很费带宽。

老鸟叮嘱

1.删除文件不等于释放空间:在 Linux 中,如果有进程正在打开一个文件,你用 `rm` 删除了它,空间不会立即释放,直到进程关闭文件或重启。这就是为什么有时候删了文件 `df` 还是显示 100%。务必用 `echo > file` 或 `lsof | grep deleted` 查找占用进程并重启它。
2.别删数据库文件:在 `/var/lib/mysql` 或 `/var/lib/postgresql` 下操作要极度小心,删了数据就真没了。
3.生产环境慎用 `rm -rf`:在执行删除命令前,多看一眼路径,建议开启 `rm -i` 交互模式,或者把删除命令改成 `mv` 到临时目录,观察几天没问题再删。
4.日志轮转是正道:与其手动清理,不如配置 `logrotate`,让系统自动按天或按大小切割日志并压缩旧日志。

FAQ

Q1: 删除了文件,但是用 `df -h` 查看磁盘空间没有减少,为什么?
A: 这是因为被删除的文件仍然被某个进程占用,文件句柄未释放。使用 `lsof | grep deleted` 查找被删除但仍被占用的文件,重启对应的进程(如 Nginx、MySQL)即可释放空间。

Q2: Docker 的 overlay2 目录占用巨大,可以手动删除里面的文件吗?
A: 绝对不要手动删除 `/var/lib/docker/overlay2` 下的子目录,这会导致容器无法启动甚至镜像损坏。请务必使用 `docker system prune` 等标准命令进行清理。

Q3: 如何让 AI Agent 自动帮我清理日志,而不是只报警?
A: 可以编写一个 Python 或 Bash 脚本,集成到 n8n 或 LangChain 中。脚本逻辑是:检测到 `/var/log/nginx/access.log` 大于 1GB 时,执行 `truncate -s 0 /var/log/nginx/access.log`。为了安全,建议让 Agent 仅执行“清空”操作,而非“删除文件”操作。

Q4: `/var/spool/postfix/maildrop` 目录有很多小文件,能删吗?
A: 这些通常是 Cron 任务发送邮件失败留下的堆积文件。如果你的服务器不需要本地邮件服务,可以安装并配置 `nullmailer` 或者直接清理该目录,并修改 Crontab 把输出重定向到 `/dev/null`,例如 `*/5 * * * * command >/dev/null 2>&1`。

磁盘空间管理是 VPS 运维的基本功,结合 AI Agent 的分析能力,我们可以从繁琐的目录跳转中解脱出来。无论是使用 Claude Code 快速生成清理脚本,还是用 n8n 做自动化监控,核心都在于先定位、后清理、再预防。配置好日志轮转和 Docker 定时任务,才能避免半夜起来救火。

转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/10098.html 商家投稿邮箱:zhujixuanblog@qq.com