---
title: 什么会留下来
description: 会话属于设备，而不属于窗口——所以关闭、退出、更新、断线都是脱离而不是杀掉。这里是每种情况下究竟有什么留了下来，以及当进程真的消失时代价是什么。
x-i18n:
  source_path: persistence.mdx
  source_hash: 07a635c93cea124055d7519d6c0674bdc028cab886e8e4f7aaa11b580751561b
  generated_at: 2026-09-19
---

Termio 在结构上只有一个承诺：会话活得比你用来看它的那个东西更久。关掉窗口、退出应用、
让它自我更新、断开连到 VPS 的 SSH——Agent 都还在干活。这一页是这个说法的诚实版本：
每件事发生后什么留了下来、什么没有，以及当进程真的消失时代价是什么。

## 规则 [#the-rule]

每个会话都跑在拥有它的那台设备上的 `termiod`——[Termio server](/zh-CN/docs/server)——里面，
本机上的也一样。Mac 应用、CLI 和 iOS 应用都只是*观察者*。观察者附着到一个会话，也从它
上面脱离；它从不持有那个进程。

所以「这会不会杀掉我的 Agent」这个问题永远归结为一件事：**是进程死了，还是只有一个观察者
松开了手？** 只有两件事会有意地结束一个会话——**关闭会话**（`⌘W`），以及进程自己退出。

## 什么能扛过什么 [#what-survives-what]

| 发生了什么 | Agent 继续运行 | 布局回来 | 屏幕回来 | 对话接得上 |
| --- | --- | --- | --- | --- |
| 切换会话、隐藏窗口、去用别的应用 | 是 | —— | 是 | 是 |
| 关闭窗口 | 是 | 是 | 是 | 是 |
| 退出 Termio（`⌘Q`）再重新打开 | 是 | 是 | 是 | 是 |
| Termio 自我更新 | 是 | 是 | 是 | 是 |
| 连到远程设备的 SSH 断了 | 是 | 是 | 是 | 是 |
| `termiod handoff`（server 原地更新） | 是 | 是 | 是 | 是 |
| server 停止，或者机器重启 | 否 | 是 | 否 | 本机上、且 Agent 支持[恢复](/zh-CN/docs/atp#resume)时才会；另一台机器上永远不会 |
| **关闭会话**（`⌘W`） | 否 | —— | —— | —— |

上面六行是同一件事的六个名字：一个观察者走了，而进程根本没察觉。重新附着会用 server
自己的回滚缓冲重绘屏幕，所以你回来看到的，就是你从没离开过时会看到的输出。

<Callout type="note">
  「布局回来」指的是侧栏树、拆分编组，以及你在每个工作区最后停留的检查器标签页。Termio
  把这套结构写到磁盘上；你终端里的内容不在其中。
</Callout>

## 脱离才是默认 [#detaching-is-the-default]

没有哪个随手的动作会结束一个会话。关窗口、退出应用、一次自我更新、笔记本在 `ssh` 中途掉了
Wi-Fi——每一样都是脱离。下次启动会重新附着到还在那里的会话，而不是新开一批，所以一次长
时间的 Agent 运行是可以放心走开的。

结束会话才是那个有意的动作：`⌘W` **关闭当前会话**，就像 `⌘W` 关掉一个浏览器标签页一样，
它的窗格也跟着收起来。等到一个会话都不剩，`⌘W` 才关闭窗口，而应用继续带着其余一切活着。
参见[键盘快捷键](/zh-CN/docs/keyboard#panes)。

<Callout type="tip">
  想离开一台机器但把活儿留着？直接退出就行。没有什么「脱离」命令要记，因为退出本身就是
  脱离。
</Callout>

## 当进程真的消失时 [#when-the-process-really-does-go-away]

一个停掉的 server——重启、一次 `termiod stop`、一台断电的机器——会把它的 PTY 一起带走。
这没有绕过去的办法；进程就是进程。Termio 能做的是让回来变得便宜：

- **树会被恢复。** 项目、worktree、工作区、拆分编组，以及你在每个工作区最后停留的会话都会
  回来，因为它们存在一个文件里，而不是存在 daemon 里。
- **会话在自己的目录里重启。** 一个 shell 回来还是一个 shell，根在原来的位置。
- **本机上能恢复的 Agent 会恢复。** 重新打开会话会把 Agent 拉回*同一段对话*，而不是一段
  空白。另一台机器上的会话永远是全新启动：恢复要读的那些记录都在本机磁盘上，而它的对话
  在那边。

恢复是**要么精确、要么不做**：Termio 要么接上会话绑定的那段确切对话，要么重新开始。它从不
去猜一段相近的。哪些 Agent 能做到，是每个 Agent 自己 CLI 的事实，写在它的
[清单](/zh-CN/docs/atp#resume)里——见[同时运行多个 Agent](/zh-CN/docs/agents#what-each-agent-reports)
里的恢复那一列。

## 扛过一次重启 [#surviving-a-reboot]

没有服务的话，server 只活到你这次登录会话结束为止。这在你面前的 Mac 上通常还行，在一台你
只通过 SSH 连的机器上就几乎从来不行——那上面根本没人交互式登录过。

```bash
termiod service install    # macOS 上是 launchd，Linux 上是 systemd --user
termiod service status
```

装上服务之后，server 会在崩溃后被拉起来，也会在重启后于登录时再次启动。在 Linux 上，想让
它扛过你的登出，还需要为这个用户打开 lingering（`loginctl enable-linger`）；没有它，这个
unit 会跟着你的会话一起停。

要把这件事说清楚：回来的是 **server**，不是它当时持有的那些进程。一次重启仍然会结束那台
机器上的每一个 PTY。服务的作用，是让「那台机器上没有任何东西在听」不再是一个永久状态——
参见[问题排查](/zh-CN/docs/troubleshooting)。

## 睡眠 [#sleep]

睡着的机器不跑任何东西，所以对笔记本来说诚实的规则是：Mac 睡着时会话不会死，它们跟着一起
暂停，醒来时接着跑。

在有值得保护的活儿时，Termio 确实会把机器挡在*闲置*睡眠之外。只要还有会话在工作中或者在
等你，server 就会续一个短的 `caffeinate` 租约，这样一台插着电的 Mac 就仍然能被连上——正好
是那个在权限提示上安静下来的 Agent 最需要的时刻，也正好是你的手机要去回答它的时候。用电池
时它根本不取租约；合上盖子机器照样睡：用户态的任何东西都覆盖不了合盖睡眠。

<Callout type="warning">
  如果你想要一个随时都能连上的会话，就把它跑在一台一直开着的机器上——一台 VPS，或者桌上
  那台 Mac mini——并把 [iPhone](/zh-CN/docs/iphone) 配对到那台，而不是配对到笔记本。
</Callout>

## 更新时不丢会话 [#updating-without-dropping-sessions]

新的 server 构建会**原地**替换正在运行的那个：进程保留它的 id 和它的 PTY，会话完全不会
察觉。

```bash
termiod handoff
```

应用自我更新时走的也是这条路，所以一次 Termio 更新不会让你赔上正在跑的 Agent。从**设置 ▸
远程主机**里设置或更新一台机器走的是同一条路；而一次*会*打断正在进行的工作的更新，会先把
话说清楚并点名那个会话。

## Termio 不会留下什么 [#what-termio-does-not-keep]

把边界说清楚，也是这个承诺的一部分：

- **Termio 不保留终端的任何记录。** 回滚缓冲在 server 里活到会话结束为止，然后跟着一起
  消失，不留下任何持久的东西。唯一的例外是一次 handoff：它通过一个随写随删的临时文件把
  每个会话的重放缓冲交给接手的 server——只在更新那一瞬间存在，不是一份留存的记录。
- **Agent 的对话属于 Agent。** 恢复的办法是把 Agent 自己的会话 id 还给它；对话在 Agent
  自己的存储里，在你自己的账号下，和从一个普通终端里跑时完全一样。
- **没有任何东西同步到别处。** 状态是每台设备一份，就在那台设备上。没有一个 Termio 云
  持有副本——参见[设备](/zh-CN/docs/devices)。

<Cards>
  <Card href="/zh-CN/docs/server" title="Termio server">
    `termiod` 是什么、它怎么装到一台机器上、以及怎么看它。
  </Card>
  <Card href="/zh-CN/docs/atp" title="Agent Terminal Protocol">
    声明一个 Agent 如何启动、如何汇报、如何恢复的那份清单。
  </Card>
  <Card href="/zh-CN/docs/troubleshooting" title="问题排查">
    重启之后会话不见了，以及其余那些常见的意外。
  </Card>
</Cards>
