☰
tmux实战指南:终端复用、会话保持与分屏操作全解析
2026/10/14 21:38:57 网站建设 项目流程

1. 为什么是 tmux:一次解决终端复用和远程断线两大痛点

经常在服务器上干活的人,几乎都逃不过这几个场景:SSH 连到远程机器跑一个耗时任务,结果网络一抖,终端一断,任务跟着没了;本地开七八个终端窗口,每个窗口里都有一套环境变量和目录状态,切来切去脑袋又要重新加载上下文。tmux 就是来解决这两件事的。它是一款终端复用器,核心能力是在一个终端里创建多个会话,每个会话可以拆出多个窗口,每个窗口又能切成多个窗格,而所有这些状态都跑在一个后台服务进程里,哪怕你关掉了终端、断开了 SSH,tmux 里跑着的进程依然活着。下次重新连上,一条命令就能把之前的界面原样拉回来。

这篇文章不是翻译手册,而是我把 tmux 用顺手之后整理的一份实战总结。内容覆盖从安装、基础命令到配置美化、脚本化操作,最后还会列出我实际踩过的坑。无论你是第一次听说 tmux,还是已经用了几年但总记不住键位,我都尽量用“为什么这么做”的视角来讲,而不只是罗列命令清单。看完之后,你至少能做到:不管手头有多少台服务器,每个服务器上开了多少个 tmux 会话,都能快速找到目标、接上状态、继续干活。

2. 安装和第一个会话:五分钟跑起来

2.1 安装与版本确认

tmux 是个老牌开源工具,绝大多数发行版和包管理器里都有。我日常接触的环境比较杂,安装命令基本不离这几条:

  • Ubuntu / Debian:sudo apt install tmux
  • CentOS / RHEL / Fedora:sudo yum install tmux或sudo dnf install tmux
  • macOS:brew install tmux
  • Windows 下用 WSL 或 Git Bash 的,直接在 Linux 子系统里装即可,原生 Windows 上跑 tmux 意义不大。

装完先确认版本:tmux -V。不同版本对新语法支持有差异,特别是状态栏配置、bind命令的写法,建议至少 2.9 以上,3.x 更好。如果版本太老,后面讲的一些配置项可能不生效,升级一下包管理器里的版本再继续。

2.2 启动、前缀键与第一个会话

tmux 启动后默认会创建一个无名会话,直接输入tmux就行。你会发现屏幕底部出现一条绿色状态栏,左侧显示会话名(一般是窗口名和编号),右侧显示时间等信息。这就是 tmux 在管理你的终端了,你看到的整个终端屏幕其实都是 tmux 模拟出来的。

tmux 的所有控制键都需要先按一个前缀键,默认是Ctrl + b。这个设计有点像游戏里的“组合键指令”,先告诉 tmux“接下来我要发命令”,再按功能键。比如要新建窗口,按Ctrl + b然后松手再按c。我见过很多新手卡在这:他们把Ctrl + b和c同时按下,结果只触发了Ctrl + b的终端默认功能。正确做法是:先按住Ctrl,敲一下b,松开两个键,再单独按c。这个手感习惯之后,后面所有操作都会顺畅很多。

第一次启动后,你可以立刻体验一下 tmux 最核心的价值:在这个终端里随便跑点什么,比如top,然后直接关掉这个终端窗口。重新打开一个终端,输入tmux attach,刚才的top进程还在跑,界面一模一样。这背后的原理是 tmux 服务进程独立于终端之外,之前的终端只是它的一个“显示窗口”,显示断了,服务没断。

2.3 新会话的命名技巧

一个服务器上开多个会话是常态,我强烈建议从第一天就养成命名会话的习惯:

tmux new -s work # 新建一个名为 work 的会话 tmux new -s blog # 新建一个名为 blog 的会话 tmux new -s debug # 新建一个名为 debug 的会话

命名之后,日常切换会非常直观。否则 session 显示成数字编号(0、1),过几天再看根本想不起这个会话在干嘛。我自己的习惯是:按项目或任务类型命名,比如web、api、db、logs,一看列表就知道该进哪个。会话名还能随时改,后面会讲到。

3. 会话管理:创建、分离、重连、切换与销毁

3.1 分离与重连:tmux 的生死存亡

会话管理的核心命令并不多,但每一条都值得认真理解。

  • 分离当前会话(detach):Ctrl + bd
  • 查看所有会话列表:tmux ls
  • 重新连接最近一个会话:tmux attach或tmux attach -t 会话名
  • 按会话名连接:tmux attach -t work
  • 按会话名切换(在 tmux 内部直接跳到另一个会话):Ctrl + bs,然后上下键选择回车

分离这个词值得解释一下。它不是“退出”,而是把当前终端和后台会话“断开连接”。会话里的命令继续跑,你随时可以用attach重新接上。这套机制是 tmux 最核心的价值,也是我远程工作时能安心关笔记本的底气。

3.2 会话内操作与键位对照

在 tmux 内部,大量操作靠快捷键,这里列出最常用的一组:

  • Ctrl + bc:新建窗口(window)
  • Ctrl + b,:重命名当前窗口
  • Ctrl + bp/n:切换到上一个 / 下一个窗口
  • Ctrl + b0~9:直接跳到编号窗口
  • Ctrl + bw:列出所有窗口,方向键选择
  • Ctrl + b&:关闭当前窗口(会询问确认)
  • Ctrl + b$:重命名当前会话

这些命令在 tmux 内部都能通过tmux命令行的形式调用,比如tmux rename-window和tmux rename-session。我建议新手先用快捷键,因为反馈快;掌握之后再学命令行形式,因为可以写进脚本自动化。

3.3 销毁会话的几种方式

会话用完要及时清理,否则tmux ls列表会越堆越长。

  • 在会话内执行exit或关闭最后一个窗口,会话自动结束
  • 用tmux kill-session -t work从外部杀会话
  • 用tmux kill-server杀掉所有会话和服务进程,这个命令慎用

我见过有人用tmux kill-session时忘记带-t,结果把当前会话也干掉了。所以养成习惯:杀之前先tmux ls确认目标会话名。

3.4 死掉的命令如何恢复

如果某个窗口里的进程真的死了,窗口并不会自动关,里面会留着 shell 的退出提示。你只需要再输入一次命令就能继续。如果整个窗口卡住无法输入,常见做法是直接杀掉这个窗口:Ctrl + b&,然后重新开一个。如果连 tmux 本身都失去响应,可以在外部终端执行tmux kill-session -t 会话名,或者更狠一点tmux kill-server,但这样会丢掉所有未保存的状态,慎用。

4. 窗口与窗格:把终端切出多块“屏幕”

4.1 窗口(Window)的本质

窗口相当于在同一个会话里开多个标签页。每个窗口都有自己的 shell、目录、命令状态。我在跑 Web 项目时习惯这么开窗口:

  • 窗口 0:编辑器,比如 vim
  • 窗口 1:开发服务器,跑日志
  • 窗口 2:Git 操作和文件操作
  • 窗口 3:数据库终端

这样一来,整个项目的上下文都在一个会话里,切换思考成本极低。窗口切换快捷键上一条已经列了,这里不重复。重点说一下窗口重命名:Ctrl + b,后输入新名字,状态栏上会显示你取的名字。建议窗口名也按用途命名,不要用默认的bash或编号,尤其是窗口开得多的时候,状态栏能一眼看清每个窗口在干嘛。

4.2 窗格(Pane):真正意义上的分屏

窗格是 tmux 里比窗口更让人觉得“爽”的功能。它允许你在同一个窗口内切割出多个区域,各自独立运行命令。常用键位:

  • Ctrl + b":水平分割窗格,上下排列
  • Ctrl + b%:垂直分割窗格,左右排列
  • Ctrl + b方向键:在窗格间移动焦点
  • Ctrl + bx:关闭当前窗格(会询问确认)
  • Ctrl + bz:最大化 / 还原当前窗格
  • Ctrl + b空格:循环切换窗格布局

典型用法来了:左边窗格跑tail -f /var/log/xxx.log,右边窗格用 vim 改代码,改完直接在右边执行重启命令,日志实时刷新。纵向横向分屏都可以随意叠加,最多能切出十几个区域。

4.3 窗格大小调整

新建窗格之后,默认均分,但实际使用中往往需要调整大小。默认键位调整起来比较别扭:

  • Ctrl + bCtrl + 方向键:按方向调整当前窗格大小
  • Ctrl + b:resize-pane -D 20:用命令精准调整,向下扩展 20 行

我个人更推荐用命令行调整,因为可以精确控制参数。比如我想让右边窗格宽度变成 60 个字符,可以执行Ctrl + b:,输入resize-pane -x 60,回车。用命令调整时,-x是宽度,-y是高度,正负数代表扩展或收缩方向。

4.4 布局循环与预设

如果你懒得手动调,tmux 提供了预设布局:

  • Ctrl + bAlt + 1~Alt + 5:五种布局快速切换
  • Ctrl + b空格:循环切换布局

五种布局分别对应:水平均分、垂直均分、主区域居左、主区域居上、非对称网格。实际使用时,我一般先切成想要的布局,再通过 resize 微调,基本能满足绝大多数场景。

5. 复制模式与文本操作:让终端也能随便选、搜、粘贴

5.1 为什么需要复制模式

平时在终端里用鼠标选中文本,有时候能选,有时候一选就乱,尤其是开启 tmux 之后,默认鼠标模式没打开时,鼠标选中文本不会自动复制到系统剪贴板,很多人卡在这里。tmux 的复制模式是为了在它的虚拟终端里提供类似 Vim 的文本操作能力:移动光标、选择文本、搜索关键词、复制到内部缓冲区。

5.2 进入复制模式的正确姿势

默认快捷键:

  • Ctrl + b[:进入复制模式
  • 进入后用方向键或 Vim 键位移动光标
  • 按空格开始选择,方向键扩大选区
  • 按回车复制选中的文本
  • Ctrl + b]:粘贴 tmux 内部缓冲区的内容

如果你日常大量使用终端复制,强烈建议开启鼠标模式,配置见下一章。开启鼠标后,直接用鼠标拖动就能在 tmux 中选中文本,松开时自动复制进 tmux 缓冲区,然后可以用Ctrl + b]粘贴。这个体验更接近图形界面。

5.3 与系统剪贴板打通

macOS 和 Linux 上要复制到系统剪贴板,需要额外配置。macOS 上通常借助pbcopy:

bind -T copy-mode Enter send-keys -X copy-pipe-and-cancel "pbcopy"

Linux 上借助xclip或xsel,比如:

bind -T copy-mode Enter send-keys -X copy-pipe-and-cancel "xclip -selection clipboard"

这段配置要写进~/.tmux.conf然后重新加载。这一部做完之后,在复制模式里选中文本回车,内容直接进入系统剪贴板,就不用再单独按Ctrl + b]了。我在服务器上通常不配置这个,因为服务器上没图形剪贴板,但本机开发机强烈建议配好。

5.4 搜索历史输出

复制模式下按/可以向下搜索历史输出,按?向上搜索。搜索时输入关键词回车,光标会跳到匹配位置,按n切换下一个结果。我在排查日志时经常用这个功能:先tail -f跑一段时间,然后进入复制模式,搜异常关键字,再往下翻看上下文。效率比重新 grep 高不少,因为日志文件可能已经轮转或超出了当前终端缓冲区。

6. 状态栏与外观定制:让 tmux 更顺眼、更好认

6.1 配置文件位置

tmux 的配置文件是~/.tmux.conf,修改后执行tmux source-file ~/.tmux.conf让它立即生效。配置文件不存在就新建一个。我建议把配置拆成几个部分:基础键位、状态栏、鼠标、复制模式、窗口窗格行为。下面这段是我用了很久的一套基础配置,可以直接复制到你的配置文件里:

# 开启鼠标模式 set -g mouse on # 修改前缀键为 Ctrl+a(如果你更喜欢) # set -g prefix C-a # unbind C-b # bind C-a send-prefix # 分割快捷键改为更方便的键位 bind | split-window -h bind - split-window -v # 重载配置的快捷键 bind r source-file ~/.tmux.conf \; display "Config Reloaded" # 窗格索引从1开始 set -g base-index 1 setw -g pane-base-index 1 # 窗口列表排序编号 set -g renumber-windows on # 终端色彩 set -g default-terminal "screen-256color" set -ga terminal-overrides ",xterm-256color:RGB"

这一套配置里,bind |和bind -是我个人非常常用的操作,分别对应垂直分割和水平分割,比默认的%和"好按得多。renew-windows on则可以让我关闭任意窗口后,编号自动重排,不会留出空号。

6.2 状态栏显示内容

状态栏默认在底部,左侧是会话名和窗口列表,右侧是时间。你可以通过status-left和status-right自定义。比如我想在右侧显示 CPU 负载、内存占用、日期时间,可以这样配:

set -g status-right "#(cat /proc/loadavg | awk '{print $1}') | %Y-%m-%d %H:%M"

这里用了 shell 命令插值,每隔一段时间会自动更新。注意#()里不要放太重的命令,否则状态栏刷新会卡。你还可以把窗口列表改成更细的样式:

set -g window-status-current-style "bg=colour33,fg=white" set -g window-status-format "#I:#W"

窗口列表默认格式是编号:窗口名,比如1:bash。我的习惯是把当前窗口标成蓝色背景,其他窗口用默认颜色,这样定位当前窗口一目了然。

6.3 主题与配色

tmux 默认配色偏绿,有人喜欢更暗的配色。最简单的做法是安装社区主题,比如tmux-powerline或各类自定义主题。但我更建议先理解状态栏的基本语法,再选主题,否则改起来一脸懵。状态栏相关配置主要围绕两个部分:status-style、window-status-current-style、window-status-style等。例如:

set -g status-style "bg=colour235,fg=colour250"

6.4 鼠标模式的细节

开启鼠标模式后,除了能用鼠标选中文本,还能点击窗口标签切换窗口、点击窗格切换焦点、拖动窗格边界调整大小。这些在图形终端里非常实用。但有两点要注意:

  • 开启鼠标后,按住Shift再选择文本,可以跳过 tmux 直接使用终端原生选择,这在某些需要复制大量代码片段时很有用。
  • 鼠标滚轮在 tmux 里默认进入复制模式并滚动历史输出,而不是滚动 shell 自身的输出。如果你不习惯,可以加配置bind -n WheelUpPane ...自定义,但一般保持默认就好。

7. 日常稳定使用:别名、脚本和一个小型工具库

7.1 常用 Shell 别名

把 tmux 常用命令封装成别名,能少打很多字。我一般在~/.bashrc或~/.zshrc里加:

alias ta='tmux attach -t' alias ts='tmux new -s' alias tl='tmux ls' alias tks='tmux kill-session -t' alias tsn='tmux display-message -p "#S"'

几行别名就能让日常工作顺滑很多。比如我在服务器上要快速进到某个工程会话,直接ta web;要新建一个临时会话,ts temp1。配合 tab 补全,几乎不用打全名。

7.2 命令行直接操作 tmux

除了交互式快捷键,tmux 所有能力都能通过命令行调用。这个特性最大的价值在于脚本化和自动化。举个例子,我可以写一个一键启动开发环境的脚本:

#!/bin/bash SESSION="dev" if ! tmux has-session -t $SESSION 2>/dev/null; then tmux new-session -d -s $SESSION -n editor tmux send-keys -t $SESSION:editor 'vim' C-m tmux new-window -t $SESSION -n server tmux send-keys -t $SESSION:server 'npm run dev' C-m tmux new-window -t $SESSION -n logs tmux send-keys -t $SESSION:logs 'tail -f /var/log/app.log' C-m fi tmux attach -t $SESSION
  • new-session -d表示新建会话但不立即连接
  • -n editor指定第一个窗口名
  • send-keys -t 会话:窗口 '命令' C-m表示向对应窗口发送命令并回车

这个模式非常有用。我每次重装环境或换新电脑后,重建开发环境只需要跑一次脚本,不用再手动开一堆窗口。你可以按自己的项目改一改,比如前端工程就把第二个窗口的命令改成yarn serve,数据库改成mysql -u root -p。

7.3 会话保存与恢复

tmux 本身不支持原生的会话持久化(重启系统后恢复),但有两个常见的处理思路:

  • 使用tmux resurrect插件:保存所有窗口、窗格、当前目录等元数据,重启后一键恢复
  • 使用tmux continuum插件:自动定时保存,并在 tmux 启动时自动恢复

这两个插件需要配合 TPM(Tmux Plugin Manager)使用。安装方法不复杂:

git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

然后在~/.tmux.conf里添加:

set -g @plugin 'tmux-plugins/tpm' set -g @plugin 'tmux-plugins/tmux-resurrect' set -g @plugin 'tmux-plugins/tmux-continuum' run '~/.tmux/plugins/tpm/tpm'

重新加载配置后按Prefix + I安装插件。装好之后,重启机器再开 tmux,之前的会话布局基本能恢复。这个方案对长期运行的任务尤其友好,不过进程状态(比如正在跑的top)本身不会恢复,恢复的只是窗口和目录状态。

7.4 窗口编号和会话编号混乱的应对

默认情况下 tmux 窗口编号从 0 开始,会话编号从 0 开始,两者互相独立,但混乱的编号很容易让我这种强迫症烦躁。我的做法:

set -g base-index 1 setw -g pane-base-index 1 set -g renumber-windows on

这样窗口编号从 1 开始;删掉中间的窗口后,后面的窗口编号自动连续。会话编号并不会自动重排,但我几乎全用命名会话,所以编号无所谓。

8. 常见问题与排查技巧:我踩过的坑和解决方案

8.1 为什么 tmux 里的颜色和主题出现异常?

最常见的原因是终端颜色定义不匹配。我发现配置了default-terminal "screen-256color"后,很多终端瞬间正常。如果还异常,检查是否还需要设置TERM=xterm-256color。另外,tmux 在 SSH 会话中继承了 SSH 环境的TERM值,可能造成冲突,可以显式指定。

8.2 为什么复制模式选中后,粘贴内容是旧内容?

tmux 内部缓冲区默认只有一个,会互相覆盖。如果你用鼠标选中再按],应该能粘到刚刚的内容,但如果你的copy-pipe-and-cancel同时绑定了外部命令而失败,缓冲区就不会更新。此时先检查配置里的命令是否存在,比如which xclip。

8.3 为什么滚轮滚动时终端输出很卡?

开鼠标模式后,滚轮事件会频繁触发 tmux 进入复制模式并重绘屏幕,在日志输出量大的窗口里卡顿很明显。解决方法是:在大量日志输出的窗口里,不要用鼠标滚轮去翻历史,而是用Prefix + [进入复制模式,再按/搜索关键词定位。另外可以临时关闭鼠标:Prefix + :输入set mouse off,需要时再开启。

8.4 tmux 里 vim 方向键失效?

这通常发生在 tmux 复制模式和 vim 快捷键冲突时。tmux 默认前缀是Ctrl + b,vim 常用Ctrl + b翻页,两者不冲突,但在 tmux 里 vim 的某些终端行为可能受TERM影响。解决方法是确保 tmux 内设置TERM=screen-256color,vim 配置里也设置set t_Co=256和set termguicolors(视版本而定)。

8.5 杀掉 tmux 服务后,所有会话丢失,怎样预防?

预防手段就是定期保存布局或直接使用 resurrect 插件。没有插件的场景下,可以在重要会话里执行tmux capture-pane -pS - > /tmp/tmux_snapshot.txt,把当前屏幕内容导出成文本,至少留个现场。真正的日志和进度要靠应用本身落盘,tmux 不是备份工具。

8.6 多个客户端连接同一个会话,怎样同步?

默认情况下,同一会话被多个客户端 attach 时,所有客户端看到的是同一块屏幕。如果想要独立视角,可以用tmux new-session -A -s name来 attach;如果实在需要多视角,最好创建多个会话而不是强行共用。

8.7 退出 tmux 后进程还在跑吗?

只要会话没有被 kill,进程就在跑。但要注意:tmux 服务进程会被系统重启杀掉,所以需要长期跑的任务,请用好systemd或cron,不要把 tmux 当成任务守护进程的替代品。

9. 我的一线使用建议:从入门到形成肌肉记忆

tmux 的学习曲线其实很短,真正的门槛只在两点:前缀键的组合键习惯,以及理解“会话 / 窗口 / 窗格”三层结构。我建议新手按这个顺序练:

先把会话管理练熟:tmux new -s test、Ctrl + b d、tmux attach -t test。然后练窗口:Ctrl + b c、Ctrl + b ,、Ctrl + b 数字。再练窗格分割和切换。最后再研究复制模式和配置美化。每一步都实际用上一周,而不是一天内浏览完所有命令。

配置文件不要一开始就抄一堆高级方案。我最初也图新鲜装了一堆插件,结果出问题都不知道是哪句配置引起的。现在我的配置保持在几十行以内,只改真实影响效率的键位和鼠标。插件也只用 resurrect 和 continuum。

最后分享一个小技巧:如果你经常要在多个服务器之间切换,可以在本地终端里给每台服务器开一个专用的 tmux 会话,命名成服务器别名,比如web-prod、db-bak。然后再用别名命令ta web-prod快速进入。这样无论有多少台机器,你都只需要在一个终端软件里管理,全局的 tmux 列表一开,所有远程工作区一目了然。这套用法我坚持了好几年,至今仍是最高效的工作方式。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询