tmux 进程管理是一套用于在 tmux 会话中运行长期存活进程的模式集合。它的目标场景是启动开发服务器、监听器(watcher)、tilt 或任何预期在对话结束后仍需继续运行的进程。
主要能力与硬性规则 这套模式包含若干硬性要求,而非建议:在调用 tmux new-session 之前必须先执行 tmux has-session 检查;会话名必须从 git rev-parse --show-toplevel 推导,绝不能硬编码;必须向已存在的项目会话添加窗口,绝不能创建并行会话;必须使用 send-keys 运行命令,绝不将内联命令传给 new-session;如果当前项目已存在会话,绝不创建新会话。核心原则是:一个项目对应一个 tmux 会话,多个进程对应同一会话内的多个窗口。
交互式 Shell 要求 应使用 send-keys 模式以保证可靠的 shell 初始化。创建会话时会自动生成一个交互式 shell,随后使用 send-keys 在该 shell 内运行命令,从而确保 PATH、direnv 及其他初始化正确执行。错误做法是使用内联命令,例如 tmux new-session -d -s "$SESSION" -n main 'tilt up',这会绕过 shell 初始化并破坏 PATH/direnv。正确做法是先检查会话是否存在,再在交互式 shell 中使用 send-keys。
会话命名约定 会话名始终从项目推导,例如 SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)。一个项目内的多个进程应使用窗口而非独立会话,例如会话 myapp 下包含窗口 server、tests、logs。
启动进程 单进程启动时,先推导会话名,若会话不存在则创建会话并发送命令。向已有会话添加窗口时,先检查该窗口是否已存在,不存在则新建窗口并发送命令。多进程场景下,可按需创建会话并添加多个窗口(幂等操作),例如为 server、tests、logs 分别创建窗口并发送对应命令。
监控输出 可通过 tmux capture-pane 捕获输出,例如获取第一个窗口或指定窗口的最后 50 行,并使用 rg 检查错误(error|fail|exception)或就绪指示(listening|ready|started)。
生命周期管理 可用的操作包括:列出所有会话(tmux ls)、列出当前会话窗口、仅杀死本项目的会话、杀死特定窗口、向窗口发送按键(如 C-c 停止进程)。
隔离规则 禁止使用 tmux kill-server;禁止杀死与当前项目不匹配的会话;始终从 git 根目录或 pwd 推导会话名;在 kill 操作前始终验证会话名。因为其他 Claude Code 实例可能运行着自己的会话。
何时使用 tmux 适合的场景包括:tilt up(始终使用 tmux)、开发服务器(npm run dev、rails s)、文件监听器(npm run watch)、测试监听器(npm run test:watch)、数据库服务器。不适合的场景包括:一次性构建(npm run build)、快速命令(少于 10 秒)、需要 stdout 直接出现在对话中。
检查进程状态 可检查会话是否存在、列出窗口及其状态(窗口名与 pane 当前命令)、检查特定窗口是否存在。
重启进程 可先发送 Ctrl+C,等待约 1 秒后再发送重启命令。
常见模式 提供了“若未运行则启动开发服务器”的完整判断逻辑(区分会话不存在、窗口不存在、已在运行三种情况),以及“等待服务器就绪”的轮询示例,通过循环捕获输出并匹配 listening|ready 直到就绪。
限制 资料未说明 tmux 本身的安装方式、版本要求、操作系统兼容性、收费或价格信息,这些内容暂未提供。