跳到正文
Termio

Termio server

一台机器上跑着什么,才让会话比应用活得久——termiod 怎么装、怎么保活、怎么原地升级,以及出问题时怎么查。

每个会话都跑在 termiod —— Termio server —— 里,跑在拥有它的那台机器上,本机的会话也 一样。Mac 应用、iOS 应用和命令行都只是观察者:它们连上一个会话,再断开。会话不属于 你当时正在看的那个窗口。

这正是退出 Termio 不会杀掉你的 Agent 的原因。

它是什么

termiod 是会话的宿主,不是窗口管理器。它持有 PTY、保存回滚缓冲,并在有观察者连上来时 给它一份快照。本机的观察者通过 Unix socket 找到它;远程则由应用开一条 SSH 管道,连到对 面那台机器上同一个二进制。一套协议,两种走法——这就是 VPS 上的会话用起来和本机一样的 原因。

窗格、拆分和布局是应用的事,永远不是 server 的事。

装到一台机器上

有两种装法,都把同一个二进制放进 ~/.local/bin,都不需要 root,也不需要包管理器。

在 Linux 机器上直接装

curl -fsSL https://www.termio.sh/install | sh

它按机器的架构(x86_64 或 aarch64)下载 termiod、termio 命令行工具和 termio-tailnet, 用发布时的校验和核对,装好后用 systemd --user 让守护进程一直运行。这些构建是静态链接的, 所以不挑发行版。

接着它用内置的 Tailscale 把 server 加入你的 tailnet,并打印一条登录链接。用你的 Mac 和 iPhone 所用的 Tailscale 账号登录。这台机器不需要装 Tailscale。登录后,安装脚本会打印一条配对链接和 一个二维码。在 Mac 上把链接粘贴到设置 ▸ 远程主机 ▸ + ▸ 与设备配对…,或者用 iPhone 应用 扫码。之后就不再经过 SSH。

再跑一次就是原地升级,会话在升级过程中继续运行。选项写在 sh -s -- 后面:

选项作用
--version 0.63.0安装指定版本,而不是最新版。
--no-service只装二进制,守护进程由你自己启动。
--no-tailscale不加入 tailnet。
--tailscale-auth-key-file FILE用一次性的 auth key 加入 tailnet,不走浏览器登录。
--dry-run只打印要做的事,不做任何改动。

从 Mac 通过 SSH 装

在设置 ▸ 远程主机里添加一台机器并按设置,就会通过 SSH 把二进制复制过去并启动它。

termio server deploy           # 在本机安装或更新,然后校验
termio -H mybox server deploy  # 同样的事,走你自己的 SSH 配置

deploy 是一次调和:无论机器处于什么状态,跑完都落到同一个状态。Termio 读 ~/.ssh/config 找主机,所以一台你已经能 ssh 上去的机器不需要任何新配置。参见 设备。

-H(--host)对每一条 termio 命令都有效,不只是 deploy: termio -H mybox server status、termio -H mybox session attach api。

让它一直活着

termio server service install    # macOS 用 launchd,Linux 用 systemd --user

没有 service 时,server 只活到你这次登录结束。装上之后,它会在崩溃后和重启后自己回来—— 这正是一台你只从远程访问的机器所需要的。

内置 Tailscale

server 可以用内置的 Tailscale 作为一台独立设备加入你的 tailnet,设备名为 termio。这台机器 不需要装 Tailscale。

termio server tailscale on  # 第一次会打印登录链接
termio pair --qr            # 连上之后,打印配对链接和二维码

只有登录它的那个 Tailscale 账号能连进来,而且每台 Mac 或 iPhone 仍然需要配对链接。这个设置在 重启和开关机后保留。

如果你的 tailnet 开启了 HTTPS 证书,客户端通过 https://termio.<tailnet>.ts.net 访问 server; 没开的话,就用它在 tailnet 上的地址加 8790 端口,Tailscale 本身已经对这条连接加密。

命令作用
termio server tailscale on --hostname NAME换一个设备名。
termio server tailscale on --auth-key-file FILE用一次性的 auth key 登录,不走浏览器。
termio server tailscale status显示是否已连上,以及客户端从哪里访问它。
termio server tailscale off离开 tailnet,直到再次 on。设备保持登录。
termio server tailscale logout让设备退出 Tailscale 登录,并关闭内置 Tailscale。

升级而不丢会话

新版本会原地替换正在运行的那个:进程保留自己的 pid 和 PTY,会话完全察觉不到。

termio server handoff

应用自我更新时走的也是这条路——这就是 Termio 更新不会让你损失正在跑的 Agent 的原因。 每种情况见什么会留下来,包括 handoff 覆盖不了的那些。

查看它

三条命令几乎能回答所有「是我的问题还是 Termio 的问题」:

命令它告诉你什么
termio server status这台机器上有什么:二进制、它的版本,以及 socket 上是否真的有守护进程在应答。
termio session ls --all宿主正持有的会话——加 --host <box> 可以问另一台机器。
termio server logs没有观察者连着的时候,server 记下了什么。-f 跟随输出,--path 打印文件路径,方便附进 bug 报告。

termiod 就是 server 进程本身,它只负责运行。本页的每一条命令都属于 termio 命令行工具,应用和安装脚本会把它放到你的 PATH 上。

停掉它

termio server stop

当还有命令在跑、或还有观察者连着时,它会拒绝,所以一次手滑的 stop 不会连带毁掉 Agent 的工作。会话在它的进程结束时结束,或者在你关掉它时结束。

文档