跳转到内容

程序状态

终端中运行的程序可以向 Server Box 主动上报当前状态:运行中、等待确认、已完成或执行失败。Server Box 会在终端标题旁实时展示状态指示,并在终端处于后台时发送系统通知。

服务器端无需安装任何附加组件。程序只需向标准输出写入简短的控制序列(escape sequence),Server Box 即可通过 SSH、Monitor 终端或本机终端自动解析。

控制序列 常见发送方 上报状态
OSC 7501 支持程序状态协议的程序 idle(空闲)、working(运行中,含进度)、done(已完成)、blocked(等待审批、输入或登录)或 error(失败),可附带标题与说明
OSC 9;4 systemd、winget 及其他支持终端进度条的程序 进度百分比、失败、暂停
OSC 133 启用了 Shell 集成的 Shell(如 fish 4) 命令开始执行、命令执行完毕及退出码
  • 终端名称前的状态圆点:展示在终端标签切换器、终端列表及侧边栏中。等待操作时为橙色,执行失败时为红色,已完成时为绿色,运行中为主题强调色(含进度时显示为进度环);空闲状态下不显示圆点。
  • 终端工具栏状态按钮:汇总展示当前会话的所有状态报告,依次为外层 Shell 状态及各个 tmux 窗格(pane)的状态。已完成或失败的记录会一直保留,直到程序刷新状态或你手动清除。
  • tmux 集成:窗口标签采用其下属窗格中优先级最高的状态颜色,窗格菜单内可分别查看各窗格的状态详情。即便某个窗格当前未在屏幕显示,其上报的状态依然会被实时捕获。
  • 系统通知:当终端不在当前前台(如已切换到其他标签页或应用退至后台)时,若程序进入等待操作、完成或失败状态,或是耗时超过 30 秒的命令执行结束,应用都会发送系统通知,点击通知即可直接跳转到对应终端。可在 设置 → SSH → 程序需要操作时通知 中关闭。
  • Android 常驻通知与 iOS 实时活动(Live Activity):在锁屏或通知栏展示当前会话中程序的状态(等待操作、已完成、失败或运行中)。由于锁屏界面无需解锁即可查看,此处仅显示状态类别,不展示具体标题与消息正文;关闭上述通知开关后将不再显示。
  • AI Agent:Agent 会结合终端屏幕内容一并读取状态报告,从而准确判断程序是否正在等待交互输入。
  • Monitor Web 面板:在网页终端顶部展示当前优先级最高的状态报告。

状态序列格式为 ESC ] 7501 ; key=value:key=value ESC \,其中 msg 与 title 字段需使用 Base64 编码:

终端窗口
status() {
printf '\e]7501;state=%s:msg=%s\e\\' "$1" "$(printf '%s' "$2" | base64 | tr -d '\n')"
}
status working 'Backing up /srv'
# ...
status done 'Backup finished'

发送 state=clear 可清除当前状态。当启用了 Shell 集成并显示下一个命令提示符,或终端会话结束时,working、blocked 和 idle 状态会自动清除,done 与 error 状态则会保留。关于多任务并发上报及 id 标识的完整规范,请参阅协议文档。

Server Box 客户端使用控制模式(control mode)连接 tmux,可直接获取每个窗格的原始输出,因此无需额外配置即可识别状态序列。

Monitor Web 面板则通过常规 tmux 客户端连接,由于 tmux 默认会过滤未知的控制序列,需在 ~/.tmux.conf 中开启透传(set -g allow-passthrough on),并由脚本将控制序列按 tmux 透传格式封装(ESC P tmux; … ESC \,且内部每个 ESC 需双写转义),状态报告才能传递到网页面板。

此外,在 tmux 会话内查询终端是否支持状态协议(OSC 7501 ; ?)时无法收到应答,但直接发送状态序列不受影响。