终端复用器-tmux


Tmux(terminal multiplexer(终端复用器)) 是一个与 GNU screen 类似的程序,可作为后者的替代品使用,采用C语言开发并在BSD许可授权使用,可从 SourceForge 网站下载。
tmux is a terminal multiplexer, it enables a number of terminals (or windows) to be accessed and controlled from a single terminal. tmux is intended to be a simple, modern, BSD-licensed alternative to programs such as GNU screen.
tmux的核心是一个终端复用器,这意味着它允许创建、访问和控制多个终端会话,可同时运行多个命令行任务,每个任务都在自己的“工作区”中;而不需要打开多个终端窗口。其关键优势之一是其自动化重复任务的能力,可以使用tmux以编程方式创建会话、窗口和窗格,这在需要设置一致工作环境或同时管理多个服务器的环境中特别有用。启动 tmux 后,在窗口底部有状态行显示,其中包括已创建的窗口列表、当前窗口(使用 * 表示)等。其允许在单个终端窗口中创建多个会话、窗口和面板,支持会话后台运行(断开连接后进程仍继续运行),非常适合远程服务器管理和多任务操作。
与 GNU screen 相似,tmux 也使用快捷键来执行相关操作。要创建一个新的窗口,可以按 C-b c,即先按 Ctrl-b,再按 c。在各个窗口间切换可使用下列快捷键:
C-b n 切换到下一个窗口
C-b p 切换到上一个窗口
C-b 0、C-b 1……n 切换到第 n 个窗口
分离会话可执行 C-b d。
与screen相比的特点:
1. 可以横向和纵向分割窗口,且窗格可以自由移动和调整大小;
2. 支持 UTF-8 及 256 色终端;
3. 可在多个缓冲区进行复制和粘贴;
4. 可通过交互式菜单来选择窗口、会话及客户端;
5. 支持跨窗口搜索;
6. 非正常断线后不需重新detach;
7. 可以在多个ssh会话中使用同一组tmux会话。
通过'tmux'的'man'手册可获得更详尽的使用指南。
运行架构
要理解 tmux 才助于分解其架构,它采用分层结构,从外到内依次为:
1.服务器:管理所有 tmux 会话。当你启动 tmux 时,实际上启动了一个处理你创建的所有会话的服务器进程。
2.会话(Session):窗口的集合。可以将会话视为一个工作区,其中所有相关任务都组织在一起。即一个独立的工作环境,可包含多个窗口。
3.窗口(Window):类似于网络浏览器中的标签,每个窗口可以包含多个窗格,并可以轻松地在它们之间切换。即会话中的一个标签页,可包含多个面板。
4. 面板(Pane)或窗格:窗口内的分割,允许同时查看和交互多个终端输出。即窗口中的分屏区域,每个面板对应一个终端。

以下是一个简单的可视化帮助理解:
服务器
└── 会话
├── 窗口 1
│ ├── 窗格 1
│ └── 窗格 2
└── 窗口 2
└── 窗格 1
这种结构使得管理复杂的任务流程成为可能,尤其是在远程工作或同时处理多个项目时。
其主要用于处理如下的情况:
1)一个命令需要很长时间才能执行完成,但是由于与 Linux 连接中断,或者执行的窗口关闭了,导致命令提前退出;
2)需要同时看两个或更多的窗口,对比文件内容或监控多个任务。
如何解决上述遇到的情况,是否存在可靠的工具可供使用?小工具tmux可以启动一系列终端会话。主要特点是 shell 连接断开后,窗口中仍然保持运行环境。当下次登录到该服务器后,可以通过 attach 命令连接到之前的窗口,继续之前的工作。在使用 tmux 之前,先要了解其中的几个概念:
session(会话):tmux 的架构是由 server 和 client 组成,它们之间通过本地 socket 交互。一个 session 表示一个与 server 的连接,允许任意多个使用者 attach 到这个 session 上,将看到完全相同的内容;
window(窗口):一个 session 包含任意多个 window,每一个 window 都占用整个屏幕;
pane(子窗口):window 可以被拆分成任意多个子窗口,称之为 pane,这些 pane 可以水平或垂直分布。
通过 tmux list-sessions 可查看当前所有会话;在 tmux 内按 Ctrl+b + w 可可视化查看窗口和面板。相关的操作基本如下:
1. 会话管理
• 新建会话
tmux new-session -s <会话名> # 新建指定名称的会话
tmux new -s <会话名> -d # 新建会话并在后台运行(不立即进入)
• 查看 / 切换会话
tmux list-sessions # 列出所有会话(缩写:tmux ls)
tmux attach -t <会话名/编号> # 进入指定会话(缩写:tmux a -t <目标>)
tmux switch-client -t <目标> # 在当前窗口切换到指定会话
• 关闭会话
tmux kill-session -t <会话名/编号> # 关闭指定会话
tmux kill-server # 关闭所有会话
2. 窗口操作(在 tmux 会话内,前缀键 Ctrl+b 后执行)
• 基本操作
• c:新建窗口(默认命名为数字,可按 , 重命名)
• w:列出所有窗口,按编号切换
• n:切换到下一个窗口
• p:切换到上一个窗口
• 0-9:切换到编号为 0-9 的窗口
• &:关闭当前窗口(需确认)
• 重命名窗口
在 tmux 内按 Ctrl+b + ,,输入新名称后回车。
3. 面板操作(在 tmux 会话内,前缀键 Ctrl+b 后执行)
• 分屏
• "(双引号):上下分屏(水平分割)
• %(百分号):左右分屏(垂直分割)
• 面板切换与调整
• 方向键:切换到相邻面板(上 / 下 / 左 / 右)
• o:顺时针切换到下一个面板
• x:关闭当前面板(需确认)
• 空格:切换面板布局(默认包含平铺、主从等模式)
• Ctrl+方向键:调整当前面板大小(长按可连续调整)
• 面板移动
• {:将当前面板与上一个面板交换位置
• }:将当前面板与下一个面板交换位置
4. 其他常用操作
• 退出 tmux 但保留会话
按 Ctrl+b + d(detach),会话会在后台继续运行。
• 复制模式
按 Ctrl+b + [ 进入复制模式,可使用方向键移动光标,按 空格 开始选择,Enter 复制,再按 Ctrl+b + ] 粘贴。
• 查看快捷键帮助
按 Ctrl+b + ? 列出所有快捷键,按 q 退出帮助界面。
配置文件
其配置文件为 ~/.tmux.conf,可自定义快捷键、样式等。示例配置:
# 更换前缀键为 Ctrl+a(类似 screen)
set -g prefix C-a
unbind C-b
bind C-a send-prefix
# 启用鼠标控制(可点击切换面板/调整大小)
set -g mouse on
# 面板分割快捷键修改
bind | split-window -h # Ctrl+a + | 垂直分屏
bind - split-window -v # Ctrl+a + - 水平分屏
# 状态栏样式
set -g status-bg black
set -g status-fg white
修改后执行 tmux source ~/.tmux.conf 生效。
使用场景
1. 远程服务器持久化任务:通过 tmux 运行脚本,断开 SSH 后任务仍继续执行,重连后可通过会话恢复。
2. 多任务并行监控:用面板分屏同时查看日志、执行命令、编辑文件(如 Ctrl+b + % 分左右屏,左侧 tail -f log.txt,右侧 vim 编辑)。
3. 会话共享:多人通过同一 tmux 会话协作操作(需相同用户登录)。若想退出窗口但不关闭会话及其中的进程,可以使用Ctrl + b,d快捷键(先按下Ctrl + b,松开后再按下d),这会将当前会话分离,使其在后台继续运行,可以随时重新附着到该会话继续操作
常用操作指令
1、基础命令
1)查看 tmux 命令列表
#完整语法:list-commands (lscm) [-F format]
#常用形式 tmux lscm
2)查看快捷键
# 完整语法:list-keys (lsk) [-T key-table] # 常用形式: tmux lsk
bind-key -T prefix C-o rotate-window
bind-key -T prefix Space next-layout
bind-key -T prefix ! break-pane
bind-key -T prefix \" split-window
bind-key -T prefix % split-window -h
bind-key -T prefix 0 select-window -t :=0
bind-key -T prefix 1 select-window -t :=1
bind-key -T prefix 2 select-window -t :=2
bind-key -T prefix 3 select-window -t :=3
bind-key -T prefix 4 select-window -t :=4
bind-key -T prefix 5 select-window -t :=5
bind-key -T prefix 6 select-window -t :=6
bind-key -T prefix 7 select-window -t :=7
bind-key -T prefix 8 select-window -t :=8
bind-key -T prefix 9 select-window -t :=9
bind-key -T prefix : command-prompt
bind-key -T prefix \; last-pane
bind-key -T prefix ? list-keys
bind-key -T prefix D choose-client -Z
bind-key -T prefix E select-layout -E
bind-key -T prefix L switch-client -l
bind-key -T prefix M select-pane -M
bind-key -T prefix c new-window
bind-key -T prefix d detach-client
bind-key -T prefix i display-message
bind-key -T prefix l last-window
bind-key -T prefix m select-pane -m
bind-key -T prefix n next-window
bind-key -T prefix o select-pane -t :.+
bind-key -T prefix p previous-window
bind-key -T prefix q display-panes
bind-key -T prefix r refresh-client
bind-key -T prefix s choose-tree -Zs
bind-key -T prefix t clock-mode
bind-key -T prefix w choose-tree -Zw
bind-key -T prefix x confirm-before -p "kill-pane #P? (y/n)" kill-pane
bind-key -T prefix z resize-pane -Z
bind-key -T prefix \{ swap-pane -U
bind-key -T prefix \} swap-pane -D
bind-key -T prefix \~ show-messages
bind-key -r -T prefix Up select-pane -U
bind-key -r -T prefix Down select-pane -D
bind-key -r -T prefix Left select-pane -L
bind-key -r -T prefix Right select-pane -R
bind-key -T prefix M-1 select-layout even-horizontal
bind-key -T prefix M-2 select-layout even-vertical
bind-key -T prefix M-3 select-layout main-horizontal
bind-key -T prefix M-4 select-layout main-vertical
bind-key -T prefix M-5 select-layout tiled
bind-key -T prefix M-n next-window -a
bind-key -T prefix M-o rotate-window -D
bind-key -T prefix M-p previous-window -a
bind-key -r -T prefix M-Up resize-pane -U 5
bind-key -r -T prefix M-Down resize-pane -D 5
bind-key -r -T prefix M-Left resize-pane -L 5
bind-key -r -T prefix M-Right resize-pane -R 5
3)快捷键的使用
当用户 attach 到一个 session 后,可以使用快捷键简化操作。tmux 中常用的快捷键通过 ctrl+b 触发。也就说,用户先按下 ctrl+b,然后松开,再其他快捷键。如上所示,常见的快捷:
0~9 表示选择 0~9 对应的 window;
" 表示水平分隔 window,即将 window 分隔为两个水平分布的 pane;
% 表示垂直分隔 window。
2、session 相关命令
1)开启一个新 session
#完整语法:new-session (new) [-AdDEPX] [-c start-directory] [-F format] [-n window-name] [-s session-name] [-t target-session] [-x width] [-y height] [command]
#常用形式 tmux new -n <window-name> -s <session-name> # 或 开启匿名session tmux
2)查看存活的 session 列表
# 完整语法:list-sessions (ls) [-F format] # 常用形式 tmux ls
3)关联一个 session
# 完整语法:attach-session (attach) [-dErx] [-c working-directory] [-t target-session]
# 常用形式 tmux attach -t <sesion>
4)分离一个 session
#完整语法:detach-client (detach) [-aP] [-E shell-command] [-s target-session] [-t target-client]
#常用形式 tmux detach
5)停止一个 session
当 attach 到一个 session 之后,在 session 在窗口中执行 exit 停止当前 window,当最后一个 window 停止之后,session 自动终止。
# kill-session [-aC] [-t target-session]
# 常用形式 tmux kill-session -t <session-name>
3、window 相关命令
1)新建一个 window
# 完整语法:new-window (neww) [-adkP] [-c start-directory] [-e environment] [-F format] [-n window-name] [-t target-window] [command]
# 常用形式:tmux neww -t <session-name[:session-index]> -n <window-name>
快捷键(ctrl +b):c
2)退出一个 window
# 完整语法:kill-window (killw) [-a] [-t target-window]
# 常用形式: tmux killw -t <window-name or window-index>
快捷键(ctrl +b):& 或在 shell 窗口执行:exit。
3)切换 window
# 完整语法:select-window (selectw) [-lnpT] [-t target-window]
# 常用形式 tmux selectw -t <window-name or window-index>
快捷键(ctrl +b):0~9
4、pane 相关命令
1)水平拆分 window(pane)
# 完整语法:split-window (splitw) [-bdefhIPv] [-c start-directory] [-e environment] [-F format] [-p percentage|-l size] [-t target-pane] [command]
# 常用形式:tmux splitw -h -t <pane-name>
快捷键(ctrl +b):%
注:水平拆分 window 是指拆分后,两个 pane 水平分布,即左右各一个窗口。
2)垂直拆分 window(pane)
# 完整语法:split-window (splitw) [-bdefhIPv] [-c start-directory] [-e environment] [-F format] [-p percentage|-l size] [-t target-pane] [command]
# 常用形式:tmux splitw -t <pane-name>
快捷键(ctrl +b):"
注:垂直拆分 window 是指拆分后,两个 pane 垂直分布,即上下各一个窗口。
3)查看 pane 列表
# 完整语法:list-panes (lsp) [-as] [-F format] [-t target-window]
# 常用形式:tmux lsp
4)切换 pane
# 完整语法:select-pane (selectp) [-DdeLlMmRU] [-T title] [-t target-pane]
# 常用形式:# 选择当前 pane 下面的 pane tmux selectp -D # 选择当前 pane 上面的 pane tmux selectp -U # 选择当前 pane 左面的 pane tmux selectp -L # 选择当前 pane 右面的pane tmux selectp -R # 选择指定名字的 pane tmux selectp -t <pane-name or pane-index>
快捷键(ctrl +b):Up、Down、Left、Right
5)退出 pane
# 完整语法:kill-pane (killp) [-a] [-t target-pane]
# 常用形式:tmux killp -t <pane-name or pane-index>
快捷键(ctrl +b):x 或在当前 pane 执行:exit。
(6)调整 pane 尺寸
# 完整语法:resize-pane (resizep) [-DLMRUZ] [-x width] [-y height] [-t target-pane] [adjustment]
# 常用形式:# 向上调整 tmux resizep -U # 向下调整 tmux resizep -D # 向左调整 tmux resizep -L # 向右调整 tmux resizep -R
快捷键:ctl + b + [Up | Down | Left | Right]
终端工作流程改造
一旦启动并运行了tmux终端的用户将从基本的命令行界面转变为多任务环境,它增强了在终端中的工作方式,提供了一种结构化且灵活的方式来同时管理多个任务。
1.工作流程:允许创建多个会话,每个会话都充当一个专用工作区。在每个会话中可以打开多个窗口并将这些窗口分割成窗格。这种设置非常适合将相关任务放在一起,例如在一个窗格中执行程序,同时在另一个窗格中监控日志。
2.持久会话:其突出功能之一是其保持会话持久性的能力。即使终端意外关闭,它也会在后台保持你的会话运行。这意味着可以从会话中分离,稍后再回来,并从离开的地方继续。
终端操作高级功能
有三个独特的功能使 tmux 的工作更加强大:
1.缩放:如果需要专注于特定任务,tmux 允许放大任何窗格,暂时将其最大化以填充整个窗口。当需要专注于特定的输出或代码而不受其他窗格的干扰时,这非常完美。
2.复制模式:tmux的复制模式是另一个强大的功能,增强了与终端的交互方式。它允许滚动浏览终端输出,搜索特定文本,甚至在不使用鼠标的情况下复制和粘贴文本。这对于那些喜欢键盘为中心的工作流程并希望保持在终端中的人来说特别有价值。
3.同步:在多个窗格中运行相同的命令?tmux通过其同步功能使这变得容易,允许在一个窗格中输入命令并在其他窗格中复制它们。这对于同时更新多个服务器等任务来说是一个巨大的时间节省。注意表示同步状态的图标。
Tmux不仅仅是为了增强你的交互式终端会话——它在与脚本和自动化工作流程集成时也非常出色。通过将 tmux 融入 shell 脚本可以自动化复杂任务,管理长时间运行的进程,并确保命令行操作更加健壮。
插件管理器
虽然 tmux 本身就很强大,但其功能可以通过插件进一步扩展。tmux 插件管理器(TPM) 简化了安装和管理这些插件的过程,允许根据特定需求自定义 tmux。TPM 使添加新功能到 tmux 变得容易,例如改进的状态行、额外的键绑定,甚至与 Slack 或 GitHub 等其他工具的集成。
Tmuxinator 允许使用简单的 YAML 配置文件定义和管理 tmux 会话,进行持久会话使设置工作环境变得容易。
1、应用场景之后台保持工作环境(或后台运行程序)
使用 xshell 连接到 Linux 服务器上,设置自己的工作环境,然后开始自己的工作。不得不断开与服务器的链接,关掉 xshell 窗口,第二天再手动恢复前一天的工作环境。使用 tmux 可以很好解决上面的问题。
首先执行 tmux new -t <session-name> 创建一个名称为 <session-name> 的 session,执行后进入了 tmux 工作 window (窗口)。接下来在该窗口中进行正常工作,在 tmux 的 window 与普通的 shell 窗口几乎没有区别。当结束了一天工作,执行 tmux detach 退出 <session-name>。次日使用 xshell 登录 linux 服务器,执行 tmux attach -t <session-name> attach 到昨天的 session,此时看到的内容和昨天退出时完全一样。如果忘了 session-name 还可以通过执行 tmux ls 查看 session 列表,再决定链接到哪个session。
2、应用场景之多窗口对比
在性能测试的时候他想同时看 CPU 实时使用情况、内存实时使用情况、实时输出的日志以及执行命令窗口。之前的做法是同时打开多个 xshell 的 tab,然后手动在屏幕上排列对齐。虽然也能解决问题,但很不方便。
如果使用 tmux 的 pane(子窗口)就能完美的解决该问题。首先 attach 到 tmux 窗口,此时看到的是一个窗口占据了整个屏幕;接着执行 tmux splitw [-h] 或者快捷键 ctrl+b # 或 /" 分隔窗口。重复上述步骤,可以得到任意多的子窗口(pane)。接下来,通过快捷键 ctrl+b Up/Down/Left/Right 在各子窗口之间切换,在各子窗口中进行不同的工作,比如右上窗口用 nomn 监视 CPU,右下窗口用 nmon 监视内存,左下窗口监视日志,左上窗口执行命令。
3、应用场景之协作开发
另一系统管理员使用相同的用户登录到 Linux 服务器,然后 attach 该用户所创建的 session,切换到正在使用的窗口。开始整个调试过程,同时其他人员在电脑屏幕上都可以看到,因为同一个 session 的窗口在各个用户之间实时共享的。
更多用法请参考《tmux使用参考》。
最新版本:2.0
更多更新内容请查看发行页面。
项目主页:http://sourceforge.net/projects/tmux/
tmux is a terminal multiplexer, it enables a number of terminals (or windows) to be accessed and controlled from a single terminal. tmux is intended to be a simple, modern, BSD-licensed alternative to programs such as GNU screen.
tmux的核心是一个终端复用器,这意味着它允许创建、访问和控制多个终端会话,可同时运行多个命令行任务,每个任务都在自己的“工作区”中;而不需要打开多个终端窗口。其关键优势之一是其自动化重复任务的能力,可以使用tmux以编程方式创建会话、窗口和窗格,这在需要设置一致工作环境或同时管理多个服务器的环境中特别有用。启动 tmux 后,在窗口底部有状态行显示,其中包括已创建的窗口列表、当前窗口(使用 * 表示)等。其允许在单个终端窗口中创建多个会话、窗口和面板,支持会话后台运行(断开连接后进程仍继续运行),非常适合远程服务器管理和多任务操作。
与 GNU screen 相似,tmux 也使用快捷键来执行相关操作。要创建一个新的窗口,可以按 C-b c,即先按 Ctrl-b,再按 c。在各个窗口间切换可使用下列快捷键:
C-b n 切换到下一个窗口
C-b p 切换到上一个窗口
C-b 0、C-b 1……n 切换到第 n 个窗口
分离会话可执行 C-b d。
与screen相比的特点:
1. 可以横向和纵向分割窗口,且窗格可以自由移动和调整大小;
2. 支持 UTF-8 及 256 色终端;
3. 可在多个缓冲区进行复制和粘贴;
4. 可通过交互式菜单来选择窗口、会话及客户端;
5. 支持跨窗口搜索;
6. 非正常断线后不需重新detach;
7. 可以在多个ssh会话中使用同一组tmux会话。
通过'tmux'的'man'手册可获得更详尽的使用指南。
运行架构
要理解 tmux 才助于分解其架构,它采用分层结构,从外到内依次为:
1.服务器:管理所有 tmux 会话。当你启动 tmux 时,实际上启动了一个处理你创建的所有会话的服务器进程。
2.会话(Session):窗口的集合。可以将会话视为一个工作区,其中所有相关任务都组织在一起。即一个独立的工作环境,可包含多个窗口。
3.窗口(Window):类似于网络浏览器中的标签,每个窗口可以包含多个窗格,并可以轻松地在它们之间切换。即会话中的一个标签页,可包含多个面板。
4. 面板(Pane)或窗格:窗口内的分割,允许同时查看和交互多个终端输出。即窗口中的分屏区域,每个面板对应一个终端。

以下是一个简单的可视化帮助理解:
服务器
└── 会话
├── 窗口 1
│ ├── 窗格 1
│ └── 窗格 2
└── 窗口 2
└── 窗格 1
这种结构使得管理复杂的任务流程成为可能,尤其是在远程工作或同时处理多个项目时。
其主要用于处理如下的情况:
1)一个命令需要很长时间才能执行完成,但是由于与 Linux 连接中断,或者执行的窗口关闭了,导致命令提前退出;
2)需要同时看两个或更多的窗口,对比文件内容或监控多个任务。
如何解决上述遇到的情况,是否存在可靠的工具可供使用?小工具tmux可以启动一系列终端会话。主要特点是 shell 连接断开后,窗口中仍然保持运行环境。当下次登录到该服务器后,可以通过 attach 命令连接到之前的窗口,继续之前的工作。在使用 tmux 之前,先要了解其中的几个概念:
session(会话):tmux 的架构是由 server 和 client 组成,它们之间通过本地 socket 交互。一个 session 表示一个与 server 的连接,允许任意多个使用者 attach 到这个 session 上,将看到完全相同的内容;
window(窗口):一个 session 包含任意多个 window,每一个 window 都占用整个屏幕;
pane(子窗口):window 可以被拆分成任意多个子窗口,称之为 pane,这些 pane 可以水平或垂直分布。
通过 tmux list-sessions 可查看当前所有会话;在 tmux 内按 Ctrl+b + w 可可视化查看窗口和面板。相关的操作基本如下:
1. 会话管理
• 新建会话
tmux new-session -s <会话名> # 新建指定名称的会话
tmux new -s <会话名> -d # 新建会话并在后台运行(不立即进入)
• 查看 / 切换会话
tmux list-sessions # 列出所有会话(缩写:tmux ls)
tmux attach -t <会话名/编号> # 进入指定会话(缩写:tmux a -t <目标>)
tmux switch-client -t <目标> # 在当前窗口切换到指定会话
• 关闭会话
tmux kill-session -t <会话名/编号> # 关闭指定会话
tmux kill-server # 关闭所有会话
2. 窗口操作(在 tmux 会话内,前缀键 Ctrl+b 后执行)
• 基本操作
• c:新建窗口(默认命名为数字,可按 , 重命名)
• w:列出所有窗口,按编号切换
• n:切换到下一个窗口
• p:切换到上一个窗口
• 0-9:切换到编号为 0-9 的窗口
• &:关闭当前窗口(需确认)
• 重命名窗口
在 tmux 内按 Ctrl+b + ,,输入新名称后回车。
3. 面板操作(在 tmux 会话内,前缀键 Ctrl+b 后执行)
• 分屏
• "(双引号):上下分屏(水平分割)
• %(百分号):左右分屏(垂直分割)
• 面板切换与调整
• 方向键:切换到相邻面板(上 / 下 / 左 / 右)
• o:顺时针切换到下一个面板
• x:关闭当前面板(需确认)
• 空格:切换面板布局(默认包含平铺、主从等模式)
• Ctrl+方向键:调整当前面板大小(长按可连续调整)
• 面板移动
• {:将当前面板与上一个面板交换位置
• }:将当前面板与下一个面板交换位置
4. 其他常用操作
• 退出 tmux 但保留会话
按 Ctrl+b + d(detach),会话会在后台继续运行。
• 复制模式
按 Ctrl+b + [ 进入复制模式,可使用方向键移动光标,按 空格 开始选择,Enter 复制,再按 Ctrl+b + ] 粘贴。
• 查看快捷键帮助
按 Ctrl+b + ? 列出所有快捷键,按 q 退出帮助界面。
配置文件
其配置文件为 ~/.tmux.conf,可自定义快捷键、样式等。示例配置:
# 更换前缀键为 Ctrl+a(类似 screen)
set -g prefix C-a
unbind C-b
bind C-a send-prefix
# 启用鼠标控制(可点击切换面板/调整大小)
set -g mouse on
# 面板分割快捷键修改
bind | split-window -h # Ctrl+a + | 垂直分屏
bind - split-window -v # Ctrl+a + - 水平分屏
# 状态栏样式
set -g status-bg black
set -g status-fg white
修改后执行 tmux source ~/.tmux.conf 生效。
使用场景
1. 远程服务器持久化任务:通过 tmux 运行脚本,断开 SSH 后任务仍继续执行,重连后可通过会话恢复。
2. 多任务并行监控:用面板分屏同时查看日志、执行命令、编辑文件(如 Ctrl+b + % 分左右屏,左侧 tail -f log.txt,右侧 vim 编辑)。
3. 会话共享:多人通过同一 tmux 会话协作操作(需相同用户登录)。若想退出窗口但不关闭会话及其中的进程,可以使用Ctrl + b,d快捷键(先按下Ctrl + b,松开后再按下d),这会将当前会话分离,使其在后台继续运行,可以随时重新附着到该会话继续操作
常用操作指令
1、基础命令
1)查看 tmux 命令列表
#完整语法:list-commands (lscm) [-F format]
#常用形式 tmux lscm
2)查看快捷键
# 完整语法:list-keys (lsk) [-T key-table] # 常用形式: tmux lsk
bind-key -T prefix C-o rotate-window
bind-key -T prefix Space next-layout
bind-key -T prefix ! break-pane
bind-key -T prefix \" split-window
bind-key -T prefix % split-window -h
bind-key -T prefix 0 select-window -t :=0
bind-key -T prefix 1 select-window -t :=1
bind-key -T prefix 2 select-window -t :=2
bind-key -T prefix 3 select-window -t :=3
bind-key -T prefix 4 select-window -t :=4
bind-key -T prefix 5 select-window -t :=5
bind-key -T prefix 6 select-window -t :=6
bind-key -T prefix 7 select-window -t :=7
bind-key -T prefix 8 select-window -t :=8
bind-key -T prefix 9 select-window -t :=9
bind-key -T prefix : command-prompt
bind-key -T prefix \; last-pane
bind-key -T prefix ? list-keys
bind-key -T prefix D choose-client -Z
bind-key -T prefix E select-layout -E
bind-key -T prefix L switch-client -l
bind-key -T prefix M select-pane -M
bind-key -T prefix c new-window
bind-key -T prefix d detach-client
bind-key -T prefix i display-message
bind-key -T prefix l last-window
bind-key -T prefix m select-pane -m
bind-key -T prefix n next-window
bind-key -T prefix o select-pane -t :.+
bind-key -T prefix p previous-window
bind-key -T prefix q display-panes
bind-key -T prefix r refresh-client
bind-key -T prefix s choose-tree -Zs
bind-key -T prefix t clock-mode
bind-key -T prefix w choose-tree -Zw
bind-key -T prefix x confirm-before -p "kill-pane #P? (y/n)" kill-pane
bind-key -T prefix z resize-pane -Z
bind-key -T prefix \{ swap-pane -U
bind-key -T prefix \} swap-pane -D
bind-key -T prefix \~ show-messages
bind-key -r -T prefix Up select-pane -U
bind-key -r -T prefix Down select-pane -D
bind-key -r -T prefix Left select-pane -L
bind-key -r -T prefix Right select-pane -R
bind-key -T prefix M-1 select-layout even-horizontal
bind-key -T prefix M-2 select-layout even-vertical
bind-key -T prefix M-3 select-layout main-horizontal
bind-key -T prefix M-4 select-layout main-vertical
bind-key -T prefix M-5 select-layout tiled
bind-key -T prefix M-n next-window -a
bind-key -T prefix M-o rotate-window -D
bind-key -T prefix M-p previous-window -a
bind-key -r -T prefix M-Up resize-pane -U 5
bind-key -r -T prefix M-Down resize-pane -D 5
bind-key -r -T prefix M-Left resize-pane -L 5
bind-key -r -T prefix M-Right resize-pane -R 5
3)快捷键的使用
当用户 attach 到一个 session 后,可以使用快捷键简化操作。tmux 中常用的快捷键通过 ctrl+b 触发。也就说,用户先按下 ctrl+b,然后松开,再其他快捷键。如上所示,常见的快捷:
0~9 表示选择 0~9 对应的 window;
" 表示水平分隔 window,即将 window 分隔为两个水平分布的 pane;
% 表示垂直分隔 window。
2、session 相关命令
1)开启一个新 session
#完整语法:new-session (new) [-AdDEPX] [-c start-directory] [-F format] [-n window-name] [-s session-name] [-t target-session] [-x width] [-y height] [command]
#常用形式 tmux new -n <window-name> -s <session-name> # 或 开启匿名session tmux
2)查看存活的 session 列表
# 完整语法:list-sessions (ls) [-F format] # 常用形式 tmux ls
3)关联一个 session
# 完整语法:attach-session (attach) [-dErx] [-c working-directory] [-t target-session]
# 常用形式 tmux attach -t <sesion>
4)分离一个 session
#完整语法:detach-client (detach) [-aP] [-E shell-command] [-s target-session] [-t target-client]
#常用形式 tmux detach
5)停止一个 session
当 attach 到一个 session 之后,在 session 在窗口中执行 exit 停止当前 window,当最后一个 window 停止之后,session 自动终止。
# kill-session [-aC] [-t target-session]
# 常用形式 tmux kill-session -t <session-name>
3、window 相关命令
1)新建一个 window
# 完整语法:new-window (neww) [-adkP] [-c start-directory] [-e environment] [-F format] [-n window-name] [-t target-window] [command]
# 常用形式:tmux neww -t <session-name[:session-index]> -n <window-name>
快捷键(ctrl +b):c
2)退出一个 window
# 完整语法:kill-window (killw) [-a] [-t target-window]
# 常用形式: tmux killw -t <window-name or window-index>
快捷键(ctrl +b):& 或在 shell 窗口执行:exit。
3)切换 window
# 完整语法:select-window (selectw) [-lnpT] [-t target-window]
# 常用形式 tmux selectw -t <window-name or window-index>
快捷键(ctrl +b):0~9
4、pane 相关命令
1)水平拆分 window(pane)
# 完整语法:split-window (splitw) [-bdefhIPv] [-c start-directory] [-e environment] [-F format] [-p percentage|-l size] [-t target-pane] [command]
# 常用形式:tmux splitw -h -t <pane-name>
快捷键(ctrl +b):%
注:水平拆分 window 是指拆分后,两个 pane 水平分布,即左右各一个窗口。
2)垂直拆分 window(pane)
# 完整语法:split-window (splitw) [-bdefhIPv] [-c start-directory] [-e environment] [-F format] [-p percentage|-l size] [-t target-pane] [command]
# 常用形式:tmux splitw -t <pane-name>
快捷键(ctrl +b):"
注:垂直拆分 window 是指拆分后,两个 pane 垂直分布,即上下各一个窗口。
3)查看 pane 列表
# 完整语法:list-panes (lsp) [-as] [-F format] [-t target-window]
# 常用形式:tmux lsp
4)切换 pane
# 完整语法:select-pane (selectp) [-DdeLlMmRU] [-T title] [-t target-pane]
# 常用形式:# 选择当前 pane 下面的 pane tmux selectp -D # 选择当前 pane 上面的 pane tmux selectp -U # 选择当前 pane 左面的 pane tmux selectp -L # 选择当前 pane 右面的pane tmux selectp -R # 选择指定名字的 pane tmux selectp -t <pane-name or pane-index>
快捷键(ctrl +b):Up、Down、Left、Right
5)退出 pane
# 完整语法:kill-pane (killp) [-a] [-t target-pane]
# 常用形式:tmux killp -t <pane-name or pane-index>
快捷键(ctrl +b):x 或在当前 pane 执行:exit。
(6)调整 pane 尺寸
# 完整语法:resize-pane (resizep) [-DLMRUZ] [-x width] [-y height] [-t target-pane] [adjustment]
# 常用形式:# 向上调整 tmux resizep -U # 向下调整 tmux resizep -D # 向左调整 tmux resizep -L # 向右调整 tmux resizep -R
快捷键:ctl + b + [Up | Down | Left | Right]
终端工作流程改造
一旦启动并运行了tmux终端的用户将从基本的命令行界面转变为多任务环境,它增强了在终端中的工作方式,提供了一种结构化且灵活的方式来同时管理多个任务。
1.工作流程:允许创建多个会话,每个会话都充当一个专用工作区。在每个会话中可以打开多个窗口并将这些窗口分割成窗格。这种设置非常适合将相关任务放在一起,例如在一个窗格中执行程序,同时在另一个窗格中监控日志。
2.持久会话:其突出功能之一是其保持会话持久性的能力。即使终端意外关闭,它也会在后台保持你的会话运行。这意味着可以从会话中分离,稍后再回来,并从离开的地方继续。
终端操作高级功能
有三个独特的功能使 tmux 的工作更加强大:
1.缩放:如果需要专注于特定任务,tmux 允许放大任何窗格,暂时将其最大化以填充整个窗口。当需要专注于特定的输出或代码而不受其他窗格的干扰时,这非常完美。
2.复制模式:tmux的复制模式是另一个强大的功能,增强了与终端的交互方式。它允许滚动浏览终端输出,搜索特定文本,甚至在不使用鼠标的情况下复制和粘贴文本。这对于那些喜欢键盘为中心的工作流程并希望保持在终端中的人来说特别有价值。
3.同步:在多个窗格中运行相同的命令?tmux通过其同步功能使这变得容易,允许在一个窗格中输入命令并在其他窗格中复制它们。这对于同时更新多个服务器等任务来说是一个巨大的时间节省。注意表示同步状态的图标。
Tmux不仅仅是为了增强你的交互式终端会话——它在与脚本和自动化工作流程集成时也非常出色。通过将 tmux 融入 shell 脚本可以自动化复杂任务,管理长时间运行的进程,并确保命令行操作更加健壮。
插件管理器
虽然 tmux 本身就很强大,但其功能可以通过插件进一步扩展。tmux 插件管理器(TPM) 简化了安装和管理这些插件的过程,允许根据特定需求自定义 tmux。TPM 使添加新功能到 tmux 变得容易,例如改进的状态行、额外的键绑定,甚至与 Slack 或 GitHub 等其他工具的集成。
Tmuxinator 允许使用简单的 YAML 配置文件定义和管理 tmux 会话,进行持久会话使设置工作环境变得容易。
1、应用场景之后台保持工作环境(或后台运行程序)
使用 xshell 连接到 Linux 服务器上,设置自己的工作环境,然后开始自己的工作。不得不断开与服务器的链接,关掉 xshell 窗口,第二天再手动恢复前一天的工作环境。使用 tmux 可以很好解决上面的问题。
首先执行 tmux new -t <session-name> 创建一个名称为 <session-name> 的 session,执行后进入了 tmux 工作 window (窗口)。接下来在该窗口中进行正常工作,在 tmux 的 window 与普通的 shell 窗口几乎没有区别。当结束了一天工作,执行 tmux detach 退出 <session-name>。次日使用 xshell 登录 linux 服务器,执行 tmux attach -t <session-name> attach 到昨天的 session,此时看到的内容和昨天退出时完全一样。如果忘了 session-name 还可以通过执行 tmux ls 查看 session 列表,再决定链接到哪个session。
2、应用场景之多窗口对比
在性能测试的时候他想同时看 CPU 实时使用情况、内存实时使用情况、实时输出的日志以及执行命令窗口。之前的做法是同时打开多个 xshell 的 tab,然后手动在屏幕上排列对齐。虽然也能解决问题,但很不方便。
如果使用 tmux 的 pane(子窗口)就能完美的解决该问题。首先 attach 到 tmux 窗口,此时看到的是一个窗口占据了整个屏幕;接着执行 tmux splitw [-h] 或者快捷键 ctrl+b # 或 /" 分隔窗口。重复上述步骤,可以得到任意多的子窗口(pane)。接下来,通过快捷键 ctrl+b Up/Down/Left/Right 在各子窗口之间切换,在各子窗口中进行不同的工作,比如右上窗口用 nomn 监视 CPU,右下窗口用 nmon 监视内存,左下窗口监视日志,左上窗口执行命令。
3、应用场景之协作开发
另一系统管理员使用相同的用户登录到 Linux 服务器,然后 attach 该用户所创建的 session,切换到正在使用的窗口。开始整个调试过程,同时其他人员在电脑屏幕上都可以看到,因为同一个 session 的窗口在各个用户之间实时共享的。
更多用法请参考《tmux使用参考》。
最新版本:2.0
更多更新内容请查看发行页面。
项目主页:http://sourceforge.net/projects/tmux/