跳转到内容

终端复用器 tmux 入门

通过 SSH 远程连接服务器执行一个耗时较长的任务时,如果网络断开或者主动关闭了终端窗口,正在运行的程序通常会随之被终止。tmux(Terminal Multiplexer,终端复用器)解决的正是这个问题:它把“正在运行的终端会话”和“当前用来查看它的终端窗口”解耦开,会话本身独立运行在后台,终端窗口断开之后,会话仍然继续运行,之后可以重新连接回去。

Terminal window
sudo apt install tmux

会话(Session)是 tmux 里独立运行的一个环境,包含了其中执行的所有命令、正在运行的程序及其状态。会话的关键特性是它的生命周期不依赖于某个具体的终端窗口——启动会话的终端窗口关闭,或者 SSH 连接断开,只要 tmux 服务本身仍在运行(通常在远程服务器上就是持续运行的),这个会话就依然存在,可以之后重新连接回去查看。

Terminal window
tmux new -s work # 新建一个名为 work 的会话
tmux ls # 列出当前所有会话
tmux attach -t work # 重新连接到名为 work 的会话
tmux kill-session -t work # 终止指定会话
  1. 通过 SSH 登录远程服务器,执行 tmux new -s work 新建一个会话
  2. 在这个会话里启动一个耗时较长的任务(比如一次大规模数据处理)
  3. 按下前缀键(默认是 Ctrl+b)再按 d,从当前会话“脱离”(Detach)——注意这不是关闭会话,任务仍在会话里继续运行
  4. 断开 SSH 连接、关闭终端,这些操作都不会影响会话内正在运行的任务
  5. 之后重新登录服务器,执行 tmux attach -t work,回到之前的会话,任务的执行状态和输出都完整保留

前缀键:tmux 内所有快捷键的入口

Section titled “前缀键:tmux 内所有快捷键的入口”

tmux 内的快捷键都需要先按前缀键(默认 Ctrl+b),松开后再按下一个具体按键,两者不是同时按下。这样设计是为了避免和 Shell 本身、或者 Shell 里正在运行的程序的快捷键冲突——只有先按了前缀键,tmux 才会把接下来的按键当作是发给自己的指令,否则会正常传递给当前面板里运行的程序。

窗口与面板:会话内部的进一步划分

Section titled “窗口与面板:会话内部的进一步划分”

一个会话内部可以再划分出多个窗口(Window,类似浏览器里的标签页,同一时刻只显示一个),每个窗口内又可以再划分出多个面板(Pane,同一屏幕内并排显示的多个终端区域):

操作 快捷键(先按前缀键)
新建窗口 c
切换到下一个/上一个窗口 n / p
垂直分割出新面板 %
水平分割出新面板 "
在面板之间切换 方向键
关闭当前面板 x

这个主题是构建可靠 Linux 开发流程的重要组成部分。对它有清晰的理解,会让后续任务变得更容易,因为你能更快地判断某一步是否缺失或使用不当。

  • 在安全的测试环境中尝试这里展示的命令和配置。
  • 比较这些概念在不同发行版或工具之间的适用差异。
  • 记下一次实践中哪些步骤成功,哪些失败,这样下次遇到问题时更容易定位。
  • 将这篇文章与系列中相关内容结合起来,加深整体理解。
  • 跳过验证步骤,默认系统已经配置正确。
  • 不对命令中的路径、软件包名称或工具版本进行适配,直接复制粘贴执行。
  • 把这个主题当成孤立的技巧,而不是整个开发流程的一部分。