会话临时文件不再塞爆内存盘:terminal.temp_dir 与 72 小时自动清理

周六晚上你让 Hermes 跑一个批量任务:后台进程写日志、代码沙箱吐中间结果、几个工具调用把输出暂时落盘。半夜醒来一看,系统弹窗说磁盘满了——打开磁盘工具,发现占满的不是你的项目目录,而是那个你从没正眼看过的 /tmp。这不是个例:很多发行版(Arch 系尤其常见)把 /tmp 挂成内存盘 tmpfs,容量只占物理内存的一小部分,Hermes 一开多进程就把它塞爆,接着是莫名其妙的写入失败、进程崩溃、任务中断。8 月 28 日合并的修复(PR #97205)把这件事一次性解决了:会话临时文件默认搬到真实磁盘,还给了你一个可以随时改位置的配置键。
问题根源:tmpfs 上的临时文件
Hermes 在跑任务时会产生一批“会话临时工件”:后台进程的日志、pid、退出码文件(hermes_bg_* 三件套)、代码执行沙箱、溢出到磁盘的工具结果。在改动之前,这些文件默认落在 /tmp。
/tmp 在很多 Linux 发行版上并不是真正的磁盘目录,而是一个 tmpfs:数据存在内存里,读写快,但容量很小(通常是物理内存的一半或更少),而且重启即失。Hermes 高负载跑起来,后台进程一多,内存盘瞬间见底。更糟的是写入失败往往不是立刻报错,而是拖到任务中途才以各种诡异的方式暴露出来。
维护者对这个问题的描述很直白:“many distros (Arch-based setups, and our own machines) mount /tmp as a small RAM-backed tmpfs, and Hermes fills it under load.”——很多发行版把 /tmp 挂成小的内存盘,Hermes 一加压就填满。这问题连官方自己的机器都中过招。
修复:临时文件默认搬到真实磁盘
改动后的解析顺序是:
terminal.temp_dir配置键(显式指定,优先级最高)TMPDIR/TMP/TEMP环境变量~/.hermes/cache/terminal(新默认值)/tmp(最后兜底)
也就是说,只要你不额外配置,会话临时文件现在会落在 Hermes 自己的缓存目录里——真实磁盘,容量不再是问题。Windows 分支也做了同样的对齐,跨平台行为一致。
72 小时自动清理
新代码里还带了一个 cleanup_terminal_temp_cache() 清理器:超过 72 小时的临时文件自动删除。它有个很细心的设计——hermes_bg_* 三件套(log / pid / exit)按“组”一起老化:一个还活着的后台服务,它的 .log 文件是新鲜的,就会“保护”看起来过期的 .pid 和 .exit 文件不被误删。这样就不会出现服务还跑着、pid 文件却被清掉导致无法追踪进程的尴尬。
想改位置?两种方式
如果你希望临时文件放在别处(比如专门的 SSD、或者某个大容量数据盘),两种方式任选。
方式一:配置键 terminal.temp_dir
# config.yaml
terminal:
temp_dir: /var/hermes-tmp
方式二:环境变量 TERMINAL_TEMP_DIR
export TERMINAL_TEMP_DIR=/var/hermes-tmp
优先级上配置键高于环境变量,两者都高于默认值。注意:如果你显式指定了位置,那个目录就由你自己管理——自动清理只作用于默认的 ~/.hermes/cache/terminal,不会去动你指定的目录(源码注释里明确写了 “User-pointed terminal.temp_dir locations are the user’s to manage”)。
对你意味着什么
- Arch / 其他 tmpfs 用户:升级后立刻受益,不需要任何配置,默认就搬到真实磁盘了;
- 想要精细控制的人:新增了配置键和环境变量,临时文件放哪你说了算;
- 担心磁盘堆积的人:72 小时自动清理 + 按组老化,不会越积越多。
这个改动还顺带解决了一类长期痛点:以前 /tmp 被塞满时,会话里跑着的沙箱会悄悄失败,现在这类“写入失败”会明显变少。如果你的 Hermes 还在用旧版本,hermes update 升级到包含该改动的最新版本即可。