tmux(Terminal Multiplexer,终端复用器)是类 Unix 系统下非常强大的命令行工具。它可以让你在一个独立的终端窗口中管理多个终端会话。

以下是对 tmux 的全面解析,涵盖概述、应用场景、底层原理、日常使用方法以及常用快捷键。


一、 tmux 概述

tmux 是一个终端复用器,类似于老牌的 GNU Screen,但拥有更现代的架构、更灵活的配置以及更丰富的功能。
它的核心作用是:允许用户在一个物理终端窗口中,创建、访问和控制多个独立的命令行终端。 即使你关闭了当前的终端窗口或网络连接断开,tmux 中运行的任务也不会停止,你可以随时重新连接(attach)并恢复工作状态。


二、 应用场景

  1. 远程服务器防断网(核心痛点)
    当通过 SSH 连接远程服务器执行耗时任务(如:编译大型代码、训练深度学习模型、备份大数据)时,如果本地网络波动导致 SSH 断开,任务会被强行终止。使用 tmux,任务在后台服务器的会话中继续运行,网络恢复后重新连接即可。
  2. 多任务与多窗口管理
    不需要打开操作系统的多个终端窗口。你可以把屏幕分割(Split)成多个窗格,一边看实时日志(tail -f),一边用 vim 写代码,一边运行测试命令,极大地提高工作效率。
  3. 工作区状态保存与恢复
    每天下班前可以直接断开(Detach)tmux,第二天上班连上服务器恢复(Attach)会话,所有打开的文件、进程、历史命令和窗口布局都和原先一模一样。
  4. 结对编程 (Pair Programming)
    多个用户可以同时接入同一个 tmux 会话,共享同一个终端屏幕,实现实时的远程协助和教学。

三、 底层原理

tmux 的强大得益于它的 C/S(Client-Server,客户端-服务端)架构

  1. Server(服务端)
    当你第一次启动 tmux 时,系统会在后台默默启动一个 tmux server 进程。这个 Server 负责管理所有的会话(Session)、窗口(Window)和伪终端(PTY)。
  2. Client(客户端)
    你在终端敲击 tmux 命令时,实际上是启动了一个 Client。Client 通过 Unix 域套接字(Unix Domain Socket,通常位于 /tmp/tmux-<uid>/)连接到 Server。Client 只负责传递键盘输入和渲染 Server 发回的屏幕画面。
  3. 层级结构
    • Session(会话):一个 Server 可以包含多个 Session。它是一组 Window 的集合。
    • Window(窗口):类似于浏览器的标签页,铺满整个屏幕。
    • Pane(窗格):一个 Window 可以被切割成多个 Pane,每个 Pane 里运行一个独立的 Shell 进程(即伪终端 PTY)。

防断网原理:因为真正的 Shell 进程(PTY)是由后台的 tmux server 创建并维护的,而不是由你本地的 SSH 连接或终端模拟器创建的。当你关闭 SSH 时,只是关闭了 tmux client,后台的 Server 和它管理的 PTY 依然存活。


四、 日常使用方法

1. 安装

  • Ubuntu/Debian: sudo apt install tmux
  • CentOS/RHEL: sudo yum install tmux
  • macOS: brew install tmux

2. 基础命令行操作 (在普通终端中执行)

  • 新建默认会话tmux
  • 新建并命名会话(推荐):tmux new -s <会话名称> (例如 tmux new -s dev
  • 查看现有会话tmux ls
  • 重新连接会话tmux attach -t <会话名称> (简写为 tmux a -t <会话名称>
  • 杀死特定会话tmux kill-session -t <会话名称>
  • 杀死所有 tmux 会话tmux kill-server

3. 配置文件 (~/.tmux.conf)

很多老手会修改默认配置以提升体验。常见的配置(需将内容写入 ~/.tmux.conf 并通过 tmux source ~/.tmux.conf 刷新):

# 将默认前缀键 Ctrl+b 修改为 Ctrl+a (类似 screen)
set-option -g prefix C-a
unbind-key C-b
bind-key C-a send-prefix

# 开启鼠标支持(支持鼠标调整窗格大小、切换窗格、滚动历史记录)
set -g mouse on

五、 常用快捷键 (在 tmux 内部使用)

tmux 的所有快捷键操作都需要先按下 前缀键 (Prefix Key)。默认的前缀键是 Ctrl + b
操作方式:先按下 Ctrlb,松开后,再按下一个目标键。

1. 会话操作 (Session)

  • Ctrl+b + d脱离 (Detach) 当前会话,将会话挂载到后台。
  • Ctrl+b + s列出并切换所有的会话(支持上下键选择,回车确认)。
  • Ctrl+b + $重命名当前会话。

2. 窗口操作 (Window) - 相当于标签页

  • Ctrl+b + c创建 (Create) 一个新窗口。
  • Ctrl+b + n:切换到 下一个 (Next) 窗口。
  • Ctrl+b + p:切换到 上一个 (Previous) 窗口。
  • Ctrl+b + 0~9:切换到指定编号的窗口。
  • Ctrl+b + w:以列表方式查看所有的窗口和会话,并支持选择切换。
  • Ctrl+b + ,重命名当前窗口。
  • Ctrl+b + &关闭当前窗口(会有确认提示)。

3. 窗格操作 (Pane) - 相当于分屏

  • Ctrl+b + %垂直分屏(左右分成两个窗格)。
  • Ctrl+b + "水平分屏(上下分成两个窗格)。
  • Ctrl+b + 方向键 (↑/↓/←/→):在不同窗格之间切换光标
  • Ctrl+b + x关闭当前所在窗格(会有确认提示)。
  • Ctrl+b + z放大/缩小 (Zoom) 当前窗格(在当前窗格全屏和恢复原状之间切换,看长日志时极其实用)。
  • Ctrl+b + 空格键:在 tmux 预设的几种窗格布局中循环切换。
  • Ctrl+b + {}:将当前窗格与上一个或下一个窗格互换位置。
  • Ctrl+b + q:显示所有窗格的编号,在编号消失前按数字键可切换到对应窗格。

4. 辅助操作

  • Ctrl+b + ?:显示所有快捷键帮助文档。
  • Ctrl+b + `
posted on 2026-03-12 17:17  LeeHang  阅读(853)  评论(0)    收藏  举报