niceeval exp 跑到一半被 kill -9、CI 时限或断电直接杀掉时,进程没有机会做任何清理。你会碰到三种残留:没跑完的评估、还在 Provider 侧占资源的 Sandbox 实例、实验 setup 起过但没关掉的外部服务(隧道、共享服务、license 席位)。三种各有一个恢复入口,都不需要手工翻 Docker 或云控制台。
正常的 Ctrl+C 或 SIGTERM 不在本页范围:那些路径 NiceEval 会自己走完全部收尾,不留残留。
重跑同一条命令,续跑没跑完的部分
已经跑完并落盘的 Attempt 是可信结果,重跑时自动带入,不再花一次 Agent 和 Sandbox 的成本:- 只补跑缺的部分:
--attempts 5已经落盘 3 次,就只再跑 2 次。 - 被强杀的实验如果留了没做完的收尾,重跑会先补一次实验级
teardown再开始,泄漏不会越积越多。 - 判定为
errored的 Attempt 不复用,照常重跑。 - 想全部重来,加
--rerun all。
收回没清理的 Sandbox 实例
先核对有哪些实例属于已经死掉的运行:orphan表示属主进程已确认死亡,可以安全销毁。正在跑的运行的实例不会出现在列表里。- 多容器题目(Compose)的伴随容器和网络跟随主实例整组列出、整组销毁,不需要再手工
docker rm收尾。 - 从别的机器创建、无法核对的实例标为
unverified,默认不动。确认后用niceeval sandbox prune --force。 - Vercel Sandbox 无法按元数据核对,到 Provider 的保留期限后自动回收,不需要处理。
--keep-sandbox留存的现场不受prune影响,仍用niceeval sandbox stop管理。
补齐实验收尾
实验setup 起的外部服务要靠实验 teardown 关掉。被强杀的运行如果你暂时不想重跑,单独补一次收尾:
- 只执行选中实验的
teardown,不跑任何评估、不跑setup。 - 随时可以执行,不依赖上次运行留下的记录。
teardown自身要能容忍重复执行。 - 强杀后原进程的内存已经丢失,
teardown里要从容器名、pid 文件或幂等的关停脚本这类持久信息找回要关的资源,不要依赖setup存在内存里的对象。
预防:让下一次强杀无害
- 长任务放在有时限的环境(CI、外部看门狗)里跑时,把时限内跑不完当成常态:靠上面的续跑机制分多次跑完,不必强求单次完成。
- 实验
teardown写成幂等的:重复执行不报错、目标已经关掉也算成功。这是补收尾机制正确工作的前提。