前言
- 最近项目中有不少使用
Windows的朋友在困扰于cmd终端无法很好地进行分屏操作的问题。 - 同时,在通过
SSH远程执行任务时,一旦连接断开,正在运行的程序也会随之中断;而如果将任务放到后台运行,又难以及时查看输出日志。 - 本文将介绍一个终端工具 ------
tmux,用来解决上述问题。
1 tmux基础
1-1 介绍
tmux(terminal multiplexer)是一款终端复用工具,它允许用户在一个终端窗口中同时管理多个会话(session)、窗口(window)和面板(pane)。
- 简单来说,tmux 可以让你在一个 SSH 连接或本地终端中"开多个终端",并且这些终端互不干扰、可独立运行。
1-2 优势介绍
- tmux 的核心优势在于
"会话与终端解耦"。它在后台维护一个独立的 session,即使 SSH 连接断开,session 仍然在服务器上持续运行,因此程序不会被终止。重新连接后,可以直接恢复到原来的工作状态。
- 在分屏方面,tmux 通过在同一个 session 内创建多个 window 和 pane,实现类似 IDE 的多窗口布局,本质上是对同一个终端会话的复用与划分,而不是启动多个独立终端进程。
- 因此,tmux 既解决了远程任务"断线即停"的问题,也提供了灵活的终端分屏与管理能力。
1-3 基础名词解释
- tmux 采用三级结构组织终端:
bash
Session(会话)
│
├── Window(窗口)
│ ├── Pane(面板)
│ ├── Pane(面板)
│ └── Pane(面板)
│
├── Window(窗口)
│ ├── Pane(面板)
│ └── Pane(面板)
│
└── Window(窗口)
└── Pane(面板)
会话(Session)- Session 是 tmux 的最顶层单位,可以理解为一个独立的工作空间。
- 一个 Session 中可以包含多个 Window。
- 即使 SSH 连接断开,Session 仍然会在后台继续运行。
- 重新连接服务器后,可以通过
attach重新进入该 Session。
窗口(Window)- Window 类似于浏览器中的标签页(Tab)。
- 一个 Session 可以拥有多个 Window。
- 每个 Window 默认包含一个 Pane。
- 不同 Window 之间互相独立,可以运行不同任务。
面板(Pane)- Pane 是 tmux 中最小的显示单元。
- 一个 Window 可以被划分为多个 Pane。
- 每个 Pane 都拥有独立的 Shell 和进程环境。
- 可以理解为终端的分屏区域。
- 你可以这么理解:
| tmux | 类比 |
|---|---|
| Session | 一个 VSCode 工程 |
| Window | 一个标签页(Tab) |
| Pane | 标签页中的分屏终端 |
Session
└── Window
└── Pane
- 通常开发时,一个项目对应一个 Session;不同功能模块放在不同 Window 中;而需要同时观察多个程序时,则使用 Pane 进行分屏。
- 每个 pane = 一个独立 tty + shell + 进程组
1-4 安装
Linux可以直接通过apt源下载
bash
sudo apt update
sudo apt install tmux -y
- 下载后直接在终端输入
bash
tmux
- 退出(如果只是把窗口关掉,
tmux仍会继续在后台运行)
bash
exit
- 注:
1-6会教学进行更为方便的鼠标和快捷键设置,下属1-5为基础指令,可以直接跳到1-6
1-5 tmux 常用指令(初学者建议直接到1-5)
- 基础会话管理
bash
tmux new -s session_name # 创建新会话
tmux ls # 查看所有会话
tmux attach -t session_name # 进入已有会话 如果只有一个会话可以直接tmux attach
tmux detach # 从当前会话退出(会话继续后台运行)
tmux kill-session -t name # 关闭指定会话
- 窗口(window)操作(tmux内)
bash
Ctrl + b c # 创建新窗口
Ctrl + b n # 下一个窗口
Ctrl + b p # 上一个窗口
Ctrl + b w # 列出所有窗口
Ctrl + b , # 重命名当前窗口
Ctrl + b & # 关闭当前窗口
- 面板(pane)分屏
bash
Ctrl + b " # 上下分屏
Ctrl + b % # 左右分屏
Ctrl + b o # 切换面板
Ctrl + b x # 关闭当前面板
Ctrl + b z # 当前面板全屏/还原
- 常用技巧
bash
Ctrl + b d # detach 当前会话(后台运行)
Ctrl + b ? # 查看帮助

1-6 自定义配置
- 初次使用
tmux且之前没怎么使用过vim或者vi的朋友可能会tmux无鼠标的基础操作吓哭了(不是) - 好消息我们可以通过设置
tmux的自定义配置让tmux更接近我们平常使用的终端 - 我们直接打开
tmux的配置文件,没有配置的可以自行创建:
bash
touch ~/.tmux.conf
- 我们添加如下内容:
bash
set -g mouse on # 开启鼠标
bind -n MouseDown2Pane choose-window # 鼠标左键选择窗口
bind | split-window -h # 左右分屏
bind - split-window -v # 上下分屏
bind Space next-layout # 更改布局
bind y setw synchronize-panes # 窗口间同步输入
bind x confirm-before -p "kill-pane #P? (y/n)" kill-pane # 关闭面板
bind X confirm-before -p "kill-window #W? (y/n)" kill-window # 关闭窗口
- 然后我们可以刷新配置文件
bash
tmux source-file ~/.tmux.conf
1-7 自定义配置基础操作
- 打开一个
tmux终端
bash
tmux
- 根据上述的配置文件,我们有如下基础操作:
1-7-1 鼠标操作
-
由于启用了鼠标操作,下面的所有操作都可以配合鼠标完成
-
鼠标左键可以正常访问不同窗口 -
鼠标拖动窗口边栏可以伸缩
-
长按鼠标右键可以呼出菜单
swap up:将当前 Pane 与上一个 Pane 交换位置。swap down:将当前 Pane 与下一个 Pane 交换位置。swap marked:与被标记(marked)的 Pane 交换位置。kill:关闭当前 Pane(相当于ctrl+b x)respawn:重新创建(重生)当前 Pane。mark:标记当前 Pane。zoom:当前 Pane 最大化。
-

1-7-1 左右分屏
- 请注意这里的
|对应在键盘上的按键是需要同时按下shift的
bash
Ctrl + b,然后按 |

1-7-2 上下分屏幕
bash
Ctrl + b,然后按 -

1-7-3 快速切换
- 配合方向按键上下左右可以随意切换窗口
bash
Ctrl + b,然后按下方向键

1-7-3 同步输入
- 当前打开的所有窗口都会同步输入一样的内容:
- 再次按下
ctrl +b y取消同步输入
- 再次按下
bash
Ctrl + b,然后按 y

1-7-4 关闭当前窗口(此关闭不会后台运行)
- 关闭面板需要提示:
bash
Ctrl + b,然后按 x

1-7-4 后台运行
- 将关闭当前
session,并切换至后台
bash
Ctrl + b,然后按 D

- 快速切换回去:(如果只有一个窗口)
bash
tmux a # 或者tmux attach
- 如果有多个:
bash
tmux attach -t session_name
1-7-5 复制
tmux的复制相对于平常的终端较为复杂,这里只讲解最简单的方案:
- 需要复制到终端外的
bash
shift+鼠标拖动选中
ctrl+shift+c # 复制
ctrl+shift+v 或者 ctrl+v # 粘贴
- 终端内复制
bash
ctrl+b [ # 复制
鼠标选中
ctrl+b ] # 粘贴
- 也可以配合插件和
~/.tmux.conf设置更多功能,这里暂不赘述
2 自动脚本
2-1 一键启动脚本
- 利用好
tmux的特性,我们可以写成自动化脚本执行所有程序
bash
#!/bin/bash
SESSION="dev"
COMMANDS=(
"echo 0"
"echo 1"
"echo 2"
"echo 3"
"echo 4"
"echo 5"
)
# 删除旧 session
tmux kill-session -t "$SESSION" 2>/dev/null
# 创建新 session
tmux new-session -d -s "$SESSION"
# 构建 2列 × 3行布局
P0=$(tmux list-panes -t "$SESSION:0" -F "#{pane_id}")
P3=$(tmux split-window -t "$P0" -h -P -F "#{pane_id}")
P1=$(tmux split-window -t "$P0" -v -P -F "#{pane_id}")
P2=$(tmux split-window -t "$P1" -v -P -F "#{pane_id}")
P4=$(tmux split-window -t "$P3" -v -P -F "#{pane_id}")
P5=$(tmux split-window -t "$P4" -v -P -F "#{pane_id}")
PANES=("$P0" "$P1" "$P2" "$P3" "$P4" "$P5")
# 自动绑定命令
for i in "${!PANES[@]}"; do
tmux send-keys -t "${PANES[$i]}" "${COMMANDS[$i]}" C-m
done
# 进入 session
tmux attach -t "$SESSION"
- 赋予上述脚本执行权限
bash
chmod +x ./bringup.sh
- 启动
bash
./bringup.sh

总结
- 本文介绍了
tmux的基础指令,以及如何通过自定义配置让tmux更好用,最后介绍了tmux一键启动多个终端的脚本。 - 如有错误,欢迎指出!
- 感谢你的观看!
