Linux——tmux工具使用说明


整体说明

  • tmux(Terminal Multiplexer 的缩写)是 Linux/Unix 系统的一款优秀的终端复用工具 (一般 Linux 系统默认自带,无需封装),也是 GNU Screen 的升级版,功能更强大、设计更优雅
  • tmux 的核心作用包括:
    • 1)借助 tmux,在远程连接服务器时,即使 断开 SSH 连接、终端关闭、网络中断 ,tmux 里运行的程序也不会停止,重新连接后可无缝恢复会话继续操作
    • 2)一个终端窗口中,创建 多个会话、多个窗口、多个分屏面板 ,无需开多个终端窗口,高效管理多个任务
    • 3)支持会话分离/接入、窗口切换、面板缩放、快捷键操作等,是后端开发/运维必备工具

安装 tmux

  • 几乎所有 Linux 发行版都能通过包管理器一键安装,系统默认一般不带,执行对应命令即可

  • CentOS / RHEL / Fedora (yum/dnf)

    1
    2
    yum install -y tmux  # CentOS7
    dnf install -y tmux # CentOS8+/Fedora
  • Ubuntu / Debian / Deepin (apt)

    1
    apt update && apt install -y tmux
  • MacOS (brew)

    1
    brew install tmux
  • 安装完成后,终端输入 tmux -V 验证版本,显示版本号即安装成功


tmux 核心概念

  • tmux 的结构是 会话 > 窗口 > 面板 三层嵌套,从大到小 包含关系

会话 (Session)

  • 最顶层的独立运行环境,一个 tmux 可以创建多个相互独立的会话
  • 每个会话有唯一的「会话名」或「会话ID」,可以随时分离(detach)接入(attach)
  • 分离会话:会话在后台继续运行,当前终端退出 tmux 界面
  • 接入会话:重新进入之前分离的会话,恢复所有操作界面,程序正常运行

窗口 (Window)

  • 一个会话里可以创建多个 窗口 ,默认占满整个屏幕,窗口之间可以快速切换
  • 类似浏览器的 标签页,比如:一个窗口跑项目日志、一个窗口执行代码部署、一个窗口做文件编辑

面板 (Pane)

  • 一个窗口里可以分割成多个 面板(分屏),所有面板在同一个窗口中显示,共享当前会话环境
  • 类似终端的「分屏功能」,比如:左边面板编辑代码、右边面板实时运行程序,上下面板分别查看日志和执行命令

tmux 通用操作规则

  • tmux 所有的功能操作,都依赖 前缀键+ 功能键 的组合方式,这是 tmux 的核心操作逻辑:

前缀键 (Prefix Key)

  • 默认的前缀键是: Ctrl + b (先按住 Ctrlb 一起松开,再按后面的功能键)

tmux 命令两种执行方式

  • 快捷键方式前缀键 + 功能键,效率最高,日常使用99%的场景都用这个;
  • 命令行方式 :在 tmux 终端中输入 tmux 命令参数,适合会话管理(创建/接入/删除)等场景

基础核心操作

  • 会话是 tmux 最核心的功能,所有操作都围绕会话展开,以下命令全部在系统原生终端执行(未进入 tmux 时)

  • 创建新会话

    1
    2
    tmux  # 创建无名称会话,默认会话ID从0开始
    tmux new -s 会话名 # 推荐!创建指定名称的会话,比如 tmux new -s project
  • 分离当前会话(核心!不会停止程序)

    • 方式一:进入 tmux 会话后,执行快捷键:Ctrl+b d(放开 CTRL+b 后再按 d)
    • 方式二:在 tmux 终端输入 tmux detach
    • 方式三:在其他外部终端输入 tmux detach -t 会话名/会话ID
    • 方式四:直接关闭窗口(SSH 或 网页窗口),不建议这种方式,可能存在问题?
    • 注:以上四种方式下,当前终端退出 tmux 界面,回到系统原生终端,tmux 会话在后台继续运行 ,里面的程序不会停止
  • 彻底关闭当前会话:

    1
    2
    exit # 简单命令
    tmux kill-session # 明确关闭当前 session
  • 查看所有后台会话

    1
    tmux ls  # 列出所有会话,格式:会话名: 窗口数 (创建时间) [终端大小]
  • 接入/恢复指定会话(核心)

    1
    2
    tmux a  # 简写,接入最近的一个会话
    tmux a -t 会话名/会话ID # 推荐!精准接入指定会话,比如 tmux a -t project
  • 关闭/杀死指定会话

    1
    2
    tmux kill-session -t 会话名/会话ID  # 比如 tmux kill-session -t project
    tmux kill-server # 慎用!杀死所有 tmux 会话,停止 tmux 服务
  • 重命名当前会话

    • 进入 tmux 会话后,快捷键:Ctrl+b $,然后输入新的会话名即可

窗口管理(待测试)

  • 窗口 = tmux 的 标签页,一个会话可以创建多个窗口,所有操作均在 tmux 会话内执行(快捷键为主)
  • 核心快捷键(均需先按 Ctrl+b 松开,再按对应键):
    • 1)c → 创建一个新的窗口(默认名称为当前路径)
    • 2)w → 弹出窗口列表,按上下键选择,回车切换
    • 3)n → 切换到下一个窗口(按创建顺序)
    • 4)p → 切换到上一个窗口(按创建顺序)
    • 5)数字键 0~9 → 快速切换到指定序号的窗口(窗口默认从0开始编号)
    • 6), → 重命名当前窗口(比如给窗口命名为 log、deploy、edit)
    • 7)& → 关闭当前窗口(会有确认提示,按 y 确认)
  • 注:这里有个 小技巧,tmux 底部状态栏会显示当前会话的所有窗口,* 标记的是当前激活的窗口

面板管理(待测试)

  • 面板 = tmux 的 分屏,一个窗口可以分割成多个面板,所有操作均在 tmux 会话内执行 ,这是 tmux 提升效率的核心功能
  • 核心快捷键(均需先按 Ctrl+b 松开,再按对应键):
  • 面板分割(创建面板)
    • %垂直分割 ,将当前面板分成左右两个面板(最常用)
    • "水平分割 ,将当前面板分成上下两个面板
  • 面板切换(重点)
    • 方向键 ↑ ↓ ← →,切换到对应方向的面板(最直观,推荐)
    • o,按顺序循环切换所有面板
    • ;, 切换到上一次操作的面板
  • 面板调整/操作
    • Ctrl + 方向键 , 调整当前面板的边框大小(按住 Ctrl+b 不放,再按方向键,持续调整)
    • x , 关闭当前面板(光标所在面板,会有确认提示,按 y 确认)
    • z , 面板最大化/还原 :当前面板占满整个窗口,再按一次恢复原大小(看日志/长代码必备)
    • ! , 将当前面板独立成新窗口 :适合需要单独放大某个面板的场景

补充:tmux 窗口无法切换 conda 问题

  • 在 tmux 窗口中,虽然终端提示符前面会显示了 conda 对应的虚拟环境 ,但这可能只是一个“假象”
    • conda activate v_name 命令实际上并没有真正生效
    • 具体表现: which pythonwhich pip 指向系统的全局路径
  • 这在 tmux 中是一个非常经典的“幽灵环境”问题
    • tmux 默认会启动一个“登录 Shell(login shell)”,它加载配置文件的顺序(如 ~/.profile)和普通终端不同,导致 conda 的初始化 Hook 没有正确执行,PATH 环境变量也就没有被正确修改
  • 原因分析:
    • 当执行 conda activate 时,conda 实际上做了两件事:
      • 1)修改 PATH 变量,把虚拟环境的 bin 目录放到最前面
      • 2)设置 CONDA_PREFIX 等环境变量
    • 在 tmux 中,由于 Shell 初始化顺序的问题,第 1 步(修改 PATH)失败了,导致虽然提示符变了,但系统底层依然在调用 /usr/bin/python

解决方案一:修改 tmux 配置(推荐:亲测可用,一劳永逸)

  • 通过修改 tmux 的配置文件,让它不再启动登录 Shell,从而保证 conda 环境能正确激活

  • Step 1,打开或创建 tmux 配置文件:

    1
    vim ~/.tmux.conf
  • Step 2,在文件中添加以下这一行配置:

    1
    set -g default-command "${SHELL}"
    • 这一行要求 tmux 启动时,启动当前默认的 shell,而不是启动一个 “login shell”
      • login shell 会重新读取一遍系统级环境变量和配置文件(如 /etc/profile 或者 ~/.zprofile 等)
      • non login shell (直接执行 ${SHELL} ) 则不会重复读取各种配置文件,速度更快,也不会因为重新加载某些环境变量而导致冲突
  • Step 3,保存退出后,彻底关闭当前的 tmux 服务 (这一步很关键,否则配置不会生效):

    1
    tmux kill-server
  • Step 4,重新启动 tmux,再次尝试 conda activate verl,此时 which python 应该就能正确指向你的虚拟环境路径了

解决方案二:手动加载 conda 初始化脚本(临时急救)

  • 如果不想修改配置文件,或者需要立刻在当前 tmux 会话中解决问题,可以手动执行一次 conda 的初始化脚本

  • 在 tmux 中直接运行以下命令(请将路径替换为你实际的 conda 安装路径,如果你用的是 Miniforge,路径通常是 ~/miniforge3/etc/profile.d/conda.sh):

    1
    source ~/miniforge3/etc/profile.d/conda.sh
  • 执行完这条命令后,再运行 conda activate verl,环境就能正常切换了