关闭Muxy后终端还在跑:深度解析Muxy背景会话(Background Sessions)功能
关闭Muxy后终端还在跑深度解析Muxy背景会话Background Sessions功能【免费下载链接】muxyLightweight and Memory efficient terminal for Mac built with SwiftUI and libghostty项目地址: https://gitcode.com/gh_mirrors/muxy1/muxy还在担心关掉 Muxy 窗口里面跑的npm run dev或长时间构建任务就会中断吗Muxy 是一款用 SwiftUI 和 libghostty 构建的轻量级、低内存占用的 Mac 终端它的**背景会话Background Sessions**功能正是为解决这个问题而生开启后即使你彻底退出 Muxy终端里运行的进程也会继续在后台存活重新打开 Muxy 时还能接回原来的会话——就像 tmux 一样但完全内置、无需额外配置。什么是 Muxy 背景会话一句话理解原理背景会话 每个终端跑在一个独立于 App 的守护进程里关掉 Muxy 只断开显示器不杀程序。由于 libghostty 独占每个终端表面的 PTY无法把一个已有的终端移交给外部进程所以 Muxy 采用了和 tmux 相同的拆分思路一个名为muxy-session的守护进程持有每个后台会话的真实 PTY并通过setsid运行在自己的会话中从而在 App 退出后依然存活每个终端面板实际运行的是muxy-session attach—— 一个轻量客户端通过 Unix socket 代理字节流、窗口尺寸和最终的退出状态。退出 Muxy 时被杀掉的只是这些 attach 客户端守护进程和它管理的 shell 继续运行。相关实现可以参考 MuxySession/main.swift 与 MuxySession/SessionDaemon.swift。一键开启如何启用 Background Sessions 设置开启路径非常简单Settings → Terminal → Background sessions几个新手需要知道的细节默认关闭偏好项默认值为false见 TerminalPersistentSessionPreferences.swift不会悄悄改变你的终端行为只影响新开的终端开关打开后只有之后新建的终端才走后台会话已经打开的终端保持原行为仅限本地终端远程 SSH 面板和 Quick Terminal快速终端永远不会使用后台会话策略见 TerminalPersistentSessionPolicy.swift。关闭Muxy后会话是怎么复活的这是背景会话最妙的部分分为三个环节1. 会话 ID 随工作区持久化每个面板都带一个会话 ID默认为其面板 ID并随工作区快照一起持久化。重新打开 Muxy 时恢复的面板会自动重新连接回它自己的会话。2. 256 KB 输出回放 自动重绘重连时守护进程会回放最近256 KB的普通输出缓冲实现见 MuxySessionProtocol/SessionReplayBuffer.swift并向前台进程组发送SIGWINCH让vim、htop这类全屏程序立刻重绘画面。回放内容是净化过的不完整的 UTF-8 序列和终端控制序列会被丢弃而不是原样发给新界面。3. 自动重连绝不丢失工作attach 客户端会在守护进程空闲关闭的瞬间按需拉起它并持续重试连接 启动整个循环直到成功或预算耗尽——所以你在旧守护进程退出过程中打开终端也不会失败重连后 Muxy 会先向守护进程确认会话状态只有守护进程确认会话真的结束了才会关闭标签页守护进程不可达会被当作连接掉线处理带退避地重连连续多次失败时标签页会停留在Reconnect占位界面上会话本身继续运行——守护进程崩溃或版本升级都不会帮你顺手关掉标签。Send to Background把标签页安全丢进后台即使 Muxy 没退出你有时也想腾出标签页但保留进程。操作方式在终端里右键点击选择Send to Background。标签页会关闭但里面的进程继续运行会话随即以detached已脱离状态出现在状态栏中。注意几个限制固定pinned标签页、混合内容分屏、远程终端、以及未开启背景会话的终端都不支持此操作。在状态栏找回脱离会话接管、新建、停止状态栏只会列出当前项目和工作区中、没有任何标签页占用的会话——已经打开在标签里的会话不需要你恢复所以不会重复出现。每一条记录都展示会话标题和工作目录并提供三个操作操作作用Active tab让当前聚焦的标签页接管该会话原会话转为脱离状态占据空位New tab在当前工作区新建一个标签页并附着到该会话Stop结束该会话及其内部所有进程一个会话同一时刻只能被一个标签页占用当你接管某个会话时它原来的主人会自动分到一个全新的会话不会出现死终端。详细文档可阅读 docs/features/terminal.md。CLI 管理后台会话不打开 App 也能控制安装 Muxy CLI 后菜单Muxy → Install CLI你可以在任意 shell 中管理后台会话# 列出所有后台会话会话ID、shell PID、工作目录、是否附着、标题…… muxy list-sessions # 结束指定会话及其内部所有进程 muxy kill-session --session $SESSION输出的attached列取true表示有终端面板正连着该会话false表示它在无人看管地运行。更多用法见 docs/features/muxy-cli.md。安全设计普通用户动不了你的会话控制 socket 放在 Muxy 的 Application Support 目录目录权限0700、socket 权限0600仅当主路径超过 Unix 104 字节sun_path限制时才回退到用户级的/tmp/muxy-uid守护进程通过LOCAL_PEERCRED校验连接方的 uid拒绝其他用户的连接开发版使用独立的sessions-dev目录与正式版互不干扰实现见 PersistentSessionPaths.swift。此外守护进程会手动复现 Ghostty 的 shell 集成注入zsh 用ZDOTDIR、bash 用ENV、fish/elvish/nushell 用XDG_DATA_DIRS因此后台终端依然拥有工作目录追踪、标签标题、提示符标记和 AI 进度显示zsh/bash/fish 之外的 shell 则与 tmux 下表现一致仅失去这些集成。常见问题 FAQQ1我为什么感觉功能没生效先确认开关已打开、并且是开关打开之后新建的终端远程终端与 Quick Terminal 本身就不走后台会话。Q2守护进程会不会一直占着内存不会。守护进程在空闲且没有任何会话时会自动退出下次 attach 客户端会按需重新拉起它。Q3重连时看到的画面是录像回放吗是的且是尽力而为的只回放最近 256 KB 的普通输出并做净化处理全屏程序如 tmux 内部、vim跳过原始回放依赖SIGWINCH触发的重绘。Q4Muxy 升级后旧会话还能接管吗每次 attach 都携带协议版本号不同版本 Muxy 启动的会话会被明确拒绝并给出清晰提示而不是被误读避免损坏你的工作现场。小结Muxy 的背景会话功能用不到十秒的开关成本换来的是 tmux 级别的进程存活能力守护进程持有 PTY、256 KB 净化回放、自动重连与状态确认、状态栏脱离会话管理再加上muxy list-sessions/kill-session的 CLI 控制——长任务不再需要手抖不敢关 App这正是 Muxy 作为一款现代 Mac 终端的底气所在。【免费下载链接】muxyLightweight and Memory efficient terminal for Mac built with SwiftUI and libghostty项目地址: https://gitcode.com/gh_mirrors/muxy1/muxy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考