niceeval exp 被 kill -9、CI 时限或断电直接中断时,进程没有机会收尾。已经跑完的 Attempt 仍保存在项目的 .niceeval/record.sqlite 里,可以照常查看;还没跑完的不会留下写了一半的结果。
正常按 Ctrl+C 或发送 SIGTERM 时,NiceEval 会自己收尾:保存已经完成的 Attempt,并把其余计划要跑的 Attempt 标成被中断。本页只处理进程没有机会收尾的情况。
先看保存下来的结果
列出这次运行创建过的 Run。如果你从--json 输出或 CI 日志里拿到了 invocationId,用它缩小范围:
pnpm exec niceeval view --run <run-id>。
被强杀的 Run 状态仍是 active。它会显示已经跑完的 Attempt,还没跑的显示为 pending。不要根据运行时长、PID 过期或心跳停止就认定它可以被接管。
结束失去进程的 Run
确认原进程已经终止后,再执行恢复:run recover 会先核实原进程确实已经终止。核实通过后,它把 Run 标成 interrupted,并为没跑完的 Attempt 写明缺失原因。它不会删除 Run 或已经跑完的 Attempt,原进程即使残留也不能再写入。
证据不足时,命令会拒绝恢复。这时先确认原进程、CI job 和可能的远程 worker 都已停止,再重试。不要因为“已经等了很久”就绕过这个检查。
补跑没完成的部分
需要拿到完整结果时,重新运行原来的 Experiment。新的运行会创建新的 Run;上次已经跑完、符合沿用条件的 Attempt 会被沿用,其余的重新跑。运行前可以先加--dry 看清哪些会沿用、哪些会重跑,规则见修改后只重跑受影响的评估。
收回强杀留下的 Sandbox
强杀时正在运行的 Sandbox 不会被登记,niceeval sandbox list 看不到它们。先只读列出这些遗留实例:
orphan表示同一台主机上创建它的进程已被证明终止,可以安全销毁。unverified表示来自另一台主机或无法确认,默认不会删除。确认它确实没人在用后,才使用pnpm exec niceeval sandbox prune --force。- Compose 的伴随容器和网络会作为一组列出和销毁。
- Vercel Sandbox 无法检索遗留实例,到 Provider 的保留期限后自行回收。
- 用
--keep-sandbox留下的现场不受prune影响,仍用niceeval sandbox stop管理,见保留 Sandbox 现场排查问题。
恢复共享状态租约
声明了sharedState.key 的 Experiment,同一个 key 同时只能有一次运行持有。原运行没有正常释放时,新的运行会一直等待,直到你显式恢复。
先运行不带 token 的检查命令,查看当前持有者的信息:
teardown。token 错误、token 已过期或 teardown 失败时,租约不会被释放,也不会影响之后新持有者的租约。修好 teardown 后,用当前显示的 token 再试。