SuperAPI AI 工具集

tmux

部署与运维

查看项目

更新于 10-15 08:48

技能介绍

用途

tmux 技能用于把 tmux 当作可编程的终端复用器,运行并交互长时间运行、有状态或交互式的命令行应用,例如 Python REPL、调试器(gdb/lldb)或常驻服务器。它通过向 tmux 会话发送按键并抓取窗格输出来实现远程控制。该技能在 Linux 和 macOS 上使用系统自带的 tmux 即可工作。

主要能力

  • 创建、查看和清理隔离的 tmux 会话。
  • 向指定会话/窗口/窗格发送字面量按键或控制键(如 C-c、C-d、C-z、Escape、Enter)。
  • 抓取窗格最近的历史输出,用于观察交互结果。
  • 通过轮询等待特定文本或提示符出现,避免与交互式工具产生竞态。
  • 提供辅助脚本:find-sessions.sh(列出会话及元数据、可按关键词过滤)和 wait-for-text.sh(按正则或固定字符串轮询窗格,支持超时)。

使用方式

1. 设置与 socket 约定

始终使用专用 socket,使会话与用户个人 tmux 环境隔离。创建并使用 AGENT_TMUX_SOCKET_DIR(默认 ${TMPDIR:-/tmp}/agent-tmux-sockets)。默认 socket 路径:SOCKET="$AGENT_TMUX_SOCKET_DIR/agent.sock"。

标准设置片段:

SOCKET_DIR=${TMPDIR:-/tmp}/agent-tmux-sockets
mkdir -p "$SOCKET_DIR"
SOCKET="$SOCKET_DIR/agent.sock"
SESSION=agent-python # 使用描述性、类似 slug 的名称,不含空格

2. 会话管理

目标格式:{session}:{window}.{pane},省略时默认为 :0.0。名称保持简短(如 agent-py、agent-gdb)。

  • 启动:tmux -S "$SOCKET" new -d -s "$SESSION" -n shell
  • 查看:tmux -S "$SOCKET" list-sessions、tmux -S "$SOCKET" list-panes -a
  • 清理:tmux -S "$SOCKET" kill-session -t "$SESSION"

3. 用户可见性(关键)

启动会话后,必须立即告诉用户如何监控该会话,给出可复制粘贴的命令。

自行监控该会话:

tmux -S "$SOCKET" attach -t <session-name>

或一次性抓取输出:

tmux -S "$SOCKET" capture-pane -p -J -t <session-name>:0.0 -S -200

4. 安全发送输入

优先使用字面量发送,避免 shell 拆分:tmux -S "$SOCKET" send-keys -t "$SESSION" -l -- "$cmd"。

组合内联命令时,使用单引号或 ANSI C 引用避免展开:tmux -S "$SOCKET" send-keys -t "$SESSION" -- $'python3 -m http.server 8000'。

发送控制键:tmux -S "$SOCKET" send-keys -t target C-c, C-d, C-z, Escape, Enter。

5. 观察输出与同步

  • 抓取最近历史:tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION" -S -200
  • 轮询提示符:使用定时轮询,避免与交互式工具产生竞态。例如在发送代码前等待 Python 提示符:
./scripts/wait-for-text.sh -S "$SOCKET" -t "$SESSION":0.0 -p '^>>>' -T 15 -l 4000

6. 交互式工具配方

Python REPL:

  • 发送:tmux -S "$SOCKET" send-keys -t "$SESSION" -- 'PYTHON_BASIC_REPL=1 python3 -q' Enter
  • 等待:wait-for-text.sh 等待 ^>>>
  • 注意:PYTHON_BASIC_REPL=1 很关键,可防止控制台干扰 send-keys。

GDB/LLDB:

  • 发送:tmux -S "$SOCKET" send-keys -t "$SESSION" -- 'gdb --quiet ./a.out' Enter
  • 禁用分页:tmux -S "$SOCKET" send-keys -t "$SESSION" -- 'set pagination off' Enter
  • 中断:发送 C-c
  • 退出:发送 quit 然后 y。
  • 注意:在 macOS 上调试默认使用 lldb。

7. 辅助脚本

./scripts 目录下提供辅助脚本:

  • find-sessions.sh:列出会话及元数据。
    • 扫描活动 socket:./scripts/find-sessions.sh -S "$SOCKET"
    • 过滤:./scripts/find-sessions.sh -S "$SOCKET" -q "python"
  • wait-for-text.sh:按正则(或固定字符串)轮询窗格,支持超时。
    • ./scripts/wait-for-text.sh -S "$SOCKET" -t session:0.0 -p 'pattern' [-F] [-T 20] [-i 0.5] [-l 2000]

8. 清理

  • 结束特定会话:tmux -S "$SOCKET" kill-session -t "$SESSION"
  • 完全清除:tmux -S "$SOCKET" kill-server

适用场景

  • 需要与 Python REPL、gdb/lldb 等交互式命令行程序进行自动化交互。
  • 运行和观察长时间运行、有状态或常驻的服务器进程。
  • 在隔离环境中管理多个交互式会话,避免影响用户个人 tmux 环境。

限制

  • 资料未提供除 Linux 和 macOS 之外平台的支持情况。
  • 资料未提供安装步骤、依赖版本要求或收费信息。
  • 资料未提供辅助脚本的具体实现细节或更多参数说明。