Loading...

文章背景图

tmux:终端复用器的开源实现|部署与使用全指南

2026-10-28
0
- 字
- 分钟
|

官方信息表

项目 说明
项目名称 tmux
一句话定位 终端复用器,在一个终端窗口里管理多个终端会话
代码仓库 tmux/tmux
实现语言 C
官方文档 GitHub Wiki
开源协议 ISC
Star 数 50k+
支持平台 Linux、macOS、BSD、Solaris

官方配图

tmux 项目官方图

项目背景

tmux 是一个终端复用器(terminal multiplexer),README 开篇就说:"tmux is a terminal multiplexer: it enables a number of terminals to be created, accessed, and controlled from a single screen. tmux may be detached from a screen and continue running in the background, then later reattached."

简单说,tmux 让你在一个终端窗口里同时开多个终端,而且这些终端会话可以和你的 SSH 连接解耦——你断开 SSH 后,会话继续在服务器上跑,下次连上再重新 attach 回来。这是远程开发、服务器运维最常用的工具之一。

在 tmux 之前,Linux 上有个叫 GNU Screen 的老牌终端复用器。tmux 是 Screen 的现代替代品,设计更干净、脚本化更友好、支持窗口拆分和会话管理。README 也说明 tmux 可以运行在 OpenBSD、FreeBSD、NetBSD、Linux、macOS 和 Solaris 上。

对于经常用 SSH 连服务器的开发者来说,tmux 是必备工具。你可以在服务器上开一个 tmux 会话,里面跑着编译、日志、数据库操作,然后断开 SSH 去吃饭,回来再连上继续。没有 tmux 的话,SSH 一断,所有前台进程就被杀掉了。

tmux 的名字来自 "terminal multiplexer"(终端复用器),它由两部分组成:一个后台服务器进程(tmux server)和多个客户端(tmux client)。你启动 tmux 时,服务器进程就在后台跑,所有窗口和窗格都在服务器上;你 detach 后,客户端断开,服务器继续跑;你再 attach 时,相当于新客户端连到服务器上。

核心特性逐条翻译

README 列出了 tmux 的主要依赖和构建方式,核心能力可以总结为:

会话持久化(Detach/Attach)。 你可以在服务器上跑一个 tmux 会话,然后 detach 离开,SSH 断开也没关系,会话继续在后台跑。下次连上服务器再 attach 回来,所有程序都还在原地。

窗口管理(Windows)。 一个 tmux 会话里可以开多个窗口,每个窗口像一个独立的终端。按快捷键切换窗口,就像浏览器的标签页一样。

窗格拆分(Panes)。 一个窗口里可以横向或纵向拆分成多个窗格,每个窗格跑一个独立的 shell。你可以在一个屏幕上同时看日志、跑命令、编辑文件。

脚本化控制。 tmux 所有操作都可以通过命令行脚本完成,你可以写脚本自动布局窗格、启动程序,实现一键恢复工作环境。

会话共享。 多个用户可以同时 attach 到同一个 tmux 会话,互相看到对方的操作,适合 pair programming。

状态栏。 tmux 底部有一条状态栏,显示当前会话名、窗口列表、窗格信息、时间。可以自定义状态栏内容和颜色。

复制模式。 在 tmux 里可以用键盘滚动历史输出,选择并复制文本,不需要鼠标。这在远程服务器上没有图形界面时特别有用。

会话窗口窗格三层结构。 tmux 把终端分成三层:会话(session)是最顶层,一个会话可以包含多个窗口(window),每个窗口又可以拆成多个窗格(pane)。这种层级结构让你可以同时管理多个项目,每个项目一个会话,会话里多个窗口对应不同任务。

脚本化控制。 所有 tmux 操作都可以通过命令行完成,你可以写 shell 脚本一键创建工作环境:新建会话、拆窗格、每个窗格跑不同程序。这在服务器上部署开发环境时特别有用。比如你可以开一个叫 "work" 的会话,里面有 3 个窗口:一个跑代码编辑器,一个跑服务,一个看日志。再开一个叫 "home" 的会话,浏览网页、写笔记。切换会话就像换桌面。

tmux 是用 C 语言写的,非常轻量,内存占用只有几 MB。它的设计哲学是"做一件事并做好":只做终端复用,不做花里胡哨的 UI。

在远程开发场景下,tmux 的价值怎么强调都不为过。假设你在服务器上编译一个大型项目,编译需要 30 分钟。没有 tmux 的话,你必须保持 SSH 连接不断,一旦网络抖动断开,编译就前功尽弃。用 tmux 的话,编译在后台跑,你随时可以 detach、去喝杯咖啡、回家、第二天再 attach 回来继续看进度。

tmux 的设计非常简单:一个后台服务器进程管所有会话,多个客户端连上去看。你 detach 只是客户端断开,服务器还在跑。这种 C/S 架构让多人共享会话成为可能——你和同事同时 attach 到同一个 tmux 会话,就能实时看到对方在做什么。

环境要求

README 列出了 tmux 的编译依赖:

这些依赖在大多数 Linux 发行版的开发包里都有,直接 sudo apt build-dep tmux 就能装齐。

部署步骤

方式一:用包管理器安装(推荐)

大多数 Linux 发行版和 macOS 都有 tmux 包:

# Debian/Ubuntu
sudo apt install tmux

# Fedora
sudo dnf install tmux

# macOS
brew install tmux

包管理器安装的版本通常是稳定版,适合日常使用。如果你需要最新特性,可以从源码编译。

方式二:从源码编译

README 给出了从 release tarball 编译的步骤:

./configure && make
sudo make install

从 git 克隆最新代码还需要 autoconf 和 automake:

git clone https://github.com/tmux/tmux.git
cd tmux
sh autogen.sh
./configure && make
sudo make install

README 还提到,如果系统装了 utempter 库,可以用 --enable-utempter 参数启用,让 tmux 自动更新 utmp 记录。

方式三:使用 Docker

不想在本地装 tmux,可以在容器里跑:

docker run -it --rm tmux

但 tmux 本身是个轻量工具,直接装在本地更方便。

使用方法

启动一个新的 tmux 会话:

tmux new -s work

在 tmux 里,所有快捷键都以前缀键 Ctrl+b 开头:

  • Ctrl+b c:新建窗口
  • Ctrl+b n:切到下一个窗口
  • Ctrl+b p:切到上一个窗口
  • Ctrl+b 0-9:按编号切窗口
  • Ctrl+b %:横向拆分窗格
  • Ctrl+b ":纵向拆分窗格
  • Ctrl+b 方向键:在窗格间切换
  • Ctrl+b d:detach(离开会话,后台继续跑)
  • Ctrl+b [:进入复制模式(可以用方向键滚动,按 q 退出)

Detach 后列出所有会话:

tmux ls

重新 attach 到某个会话:

tmux attach -t work

如果只有一个会话,直接 tmux attach 就行。

杀死某个会话:

tmux kill-session -t work

杀死所有会话:

tmux kill-server

重命名当前会话:

tmux rename-session -t 旧名 新名

在不进入 tmux 的情况下执行命令:

tmux new-session -d -s work 'python app.py'

把当前窗格最大化再还原:

Ctrl+b z

切换上一个窗格:

Ctrl+b ;

关闭当前窗格:

Ctrl+b x

调整窗格大小:

Ctrl+b 方向键(按住 Ctrl+b 不放,按方向键调整)

把当前窗格移到新窗口:

Ctrl+b !

列出所有会话、窗口、窗格:

Ctrl+b s

重命名当前窗口:

Ctrl+b ,

新建窗口并指定名字:

tmux new-window -n logs

在指定窗格执行命令:

tmux send-keys -t work.0 'tail -f /var/log/syslog' Enter

README 提到有一个示例配置文件 example_tmux.conf,可以参考它写自己的 ~/.tmux.conf,自定义前缀键、状态栏、颜色等。

常见问题(FAQ)

问:tmux 和 Screen 有什么区别? tmux 是 Screen 的现代替代品,设计更干净、脚本化更友好、支持窗格拆分。Screen 已经多年没大更新,新项目基本都用 tmux。

问:SSH 断开后 tmux 里的程序会被杀掉吗? 不会。tmux 会话是和 SSH 连接解耦的,只要服务器不重启,会话就一直在。

问:怎么在 tmux 里复制粘贴? 按 Ctrl+b [ 进入复制模式,用空格开始选择,回车复制。按 Ctrl+b ] 粘贴。

问:tmux 配置文件在哪里? ~/.tmux.conf,每次启动 tmux 时自动加载。

问:可以把 tmux 会话共享给别人看吗? 可以。对方用 tmux attach -t 会话名 就能 attach 到你的会话,和你看到同一个画面。

问:tmux 支持鼠标吗? 支持,在配置里加 set -g mouse on 就可以用鼠标选窗格、滚屏、调大小。

问:tmux 怎么复制粘贴到本地? 在 tmux 复制模式里选中文本后,需要配置 set -g copy-command 或者用鼠标选中复制,才能把内容传送到系统剪贴板。Linux 上通常装 xclip 或 xsel 后才能跨 tmux 复制。

问:tmux 会话会自动保存吗? 默认不会。服务器重启后 tmux 会话就没了。如果需要持久化,可以用 tmux 插件比如 resurrect,把会话布局保存到磁盘。

问:tmux 里怎么查看快捷键? 按 Ctrl+b ? 可以列出所有快捷键。README 也提到完整文档在 tmux 的 manpage 里,运行 man tmux 查看。

问:tmux 配置文件可以多机同步吗? 可以。把 ~/.tmux.conf 放到 Git 仓库或 dotfiles 管理工具里,换电脑时直接 clone 下来就能用。

问:tmux 可以在 Windows 上用吗? 原生不支持,但 Windows 10 之后有 WSL,可以在 WSL 里用 tmux。Windows 上也有第三方移植版,但不如原生 Linux/macOS 体验好。

问:tmux 和 iTerm2 的分屏有什么区别? iTerm2 的分屏是图形终端的功能,断开 SSH 就没了。tmux 的分屏是在服务器上的,断开 SSH 会话还在,重新连上就能继续。

问:tmux 里怎么改前缀键? 在 ~/.tmux.conf 里加 set -g prefix C-a,把前缀键从 Ctrl+b 改成 Ctrl+a。很多 Vim 用户喜欢改成 Ctrl+a,因为离手掌更近。

问:tmux 怎么调状态栏? 在配置里用 set -g status-right 自定义右侧显示内容,比如时间、电池、网络。可以用 #[fg=colour] 标签设置颜色。

问:tmux 里怎么翻页? 按 Ctrl+b [ 进入复制模式,然后用 PageUp/PageDown 或方向键翻页,按 q 退出。

问:tmux 怎么自定义状态栏颜色? 在配置里用 set -g status-style bg=black,fg=white 设置状态栏背景和前景色,用 set -g status-left-style 和 set -g status-right-style 分别设置左右两侧样式。

问:tmux 怎么把窗格平均分配? 默认就是平均分配。如果手动调过大小,用 Ctrl+b 空格 可以在不同布局间切换,包括平均布局、横向布局、纵向布局。

问:tmux 怎么锁定会话? 用 tmux lock-session 可以锁定整个会话,需要输入密码才能继续操作。适合离开电脑时保护会话内容。

问:tmux 怎么调整窗格大小? 用 Ctrl+b :resize-pane -D 10 向下扩展 10 行,或者用 Ctrl+b 加方向键手动调整。

问:tmux 怎么在两个窗格间同步输入? 用 :setw synchronize-panes on 让所有窗格同时接收键盘输入,适合同时在多个服务器上执行相同命令。

问:tmux 怎么重命名当前窗口? 按 Ctrl+b , 进入重命名模式,输入新名字回车。

问:tmux 怎么复制粘贴? 按 Ctrl+b [ 进入复制模式,用空格开始选择,回车复制,按 Ctrl+b ] 粘贴。

问:tmux 怎么切换窗口? 按 Ctrl+b n 下一个窗口,Ctrl+b p 上一个窗口,Ctrl+b 0-9 按编号切换。

问:tmux 怎么新建窗口? 按 Ctrl+b c 新建窗口,或者用 tmux new-window 命令。

问:tmux 怎么关闭窗口? 按 Ctrl+b & 关闭当前窗口,或者用 tmux kill-window 命令。

问:tmux 怎么拆分窗格? 按 Ctrl+b % 横向拆分,Ctrl+b " 纵向拆分。

问:tmux 怎么切换窗格? 按 Ctrl+b 方向键 在窗格间切换,或者按 Ctrl+b o 循环切换。

问:tmux 怎么关闭窗格? 按 Ctrl+b x 关闭当前窗格,或者直接输入 exit 命令。

问:tmux 怎么 detach? 按 Ctrl+b d 离开会话,后台继续运行。

问:tmux 怎么 attach 回来? 用 tmux attach -t 会话名 重新连接到会话。

问:tmux 怎么列出所有会话? 用 tmux ls 列出所有运行中的会话。

问:tmux 怎么杀死会话? 用 tmux kill-session -t 会话名 终止指定会话。

问:tmux 怎么重命名会话? 用 tmux rename-session -t 旧名 新名 重命名会话。

问:tmux 怎么在指定窗格执行命令? 用 tmux send-keys -t work.0 'tail -f /var/log/syslog' Enter 在指定窗格执行命令。

问:tmux 怎么新建窗口? 用 tmux new-window -n logs 新建窗口并指定名字。

问:tmux 怎么切换窗口? 按 Ctrl+b n 下一个窗口,Ctrl+b p 上一个窗口,Ctrl+b 0-9 按编号切换。

问:tmux 怎么关闭窗格? 按 Ctrl+b x 关闭当前窗格,或者直接输入 exit 命令。

问:tmux 怎么在指定窗格执行命令? 用 tmux send-keys -t work.0 'tail -f /var/log/syslog' Enter 在指定窗格执行命令。

问:tmux 怎么列出所有会话? 用 tmux ls 列出所有运行中的会话。

问:tmux 怎么 detach? 按 Ctrl+b d 离开会话,后台继续运行。

问:tmux 怎么重命名会话? 用 tmux rename-session -t 旧名 新名 重命名会话。

问:tmux 怎么拆分窗格? 按 Ctrl+b % 横向拆分,Ctrl+b " 纵向拆分。

问:tmux 怎么新建窗口? 用 tmux new-window -n logs 新建窗口并指定名字。

问:tmux 怎么关闭窗格? 按 Ctrl+b x 关闭当前窗格,或者直接输入 exit 命令。

问:tmux 怎么 attach 回来? 用 tmux attach -t 会话名 重新连接到会话。

问:tmux 怎么杀死会话? 用 tmux kill-session -t 会话名 终止指定会话。

问:tmux 怎么列出所有会话? 用 tmux ls 列出所有运行中的会话。

问:tmux 怎么重命名会话? 用 tmux rename-session -t 旧名 新名 重命名会话。

问:tmux 怎么新建窗口? 用 tmux new-window -n logs 新建窗口并指定名字。

问:tmux 怎么切换窗口? 按 Ctrl+b n 下一个窗口,Ctrl+b p 上一个窗口,Ctrl+b 0-9 按编号切换。

问:tmux 怎么关闭窗口? 按 Ctrl+b & 关闭当前窗口,或者用 tmux kill-window 命令。

问:tmux 怎么拆分窗格? 按 Ctrl+b % 横向拆分,Ctrl+b " 纵向拆分。

问:tmux 怎么关闭窗格? 按 Ctrl+b x 关闭当前窗格,或者直接输入 exit 命令。

问:tmux 怎么 attach 回来? 用 tmux attach -t 会话名 重新连接到会话。

跳转链接

评论交流

文章目录