tmux 是一个终端复用器,它最直接的作用是让终端会话与 SSH 连接脱离关系。比如在 RHEL 服务器上执行一个需要跑几个小时的数据库备份脚本时,如果本地网络突然断开,传统 SSH 会话中的进程会收到 SIGHUP 信号而终止。tmux 把进程放在服务端守护的会话里,本地终端只是这个会话的一个客户端视图,断开连接后重新登录并执行 tmux attach 就能恢复现场。

tmux 核心概念与 RHEL 安装
理解 tmux 需要先分清三个层级:会话、窗口和面板。会话是最高层级的运行单元,一个会话可以包含多个窗口,每个窗口又可以被分割成多个面板。可以把会话理解成一个完整的工作台,窗口是工作台上的不同选项卡,面板则是在同一个窗口里并列显示多个终端输入区。
在 RHEL 8/9 上安装 tmux 非常直接,使用 dnf 即可。安装完成后无需额外配置就能使用基础功能。如果企业环境启用了 SELinux,tmux 的运行通常不受影响,因为它的行为只是创建伪终端和套接字文件。
sudo dnf install -y tmux tmux -V
安装完成后,可以在当前终端执行 tmux new -s dev 创建一个名为 dev 的新会话。创建后终端会进入 tmux 环境,底部状态栏会显示会话名、窗口编号和当前时间。此时即便退出 SSH,只要不主动执行 tmux kill-session,会话仍然保留在系统中。
常用按键与窗口面板管理
tmux 的几乎所有操作都依赖前缀键。默认前缀键是 Ctrl+b,按下前缀键后再按一个功能键,才会触发对应的 tmux 命令。比如先按 Ctrl+b,松开后再按 c,就能新建一个窗口。这种两段式按键设计避免了与 Shell 或编辑器快捷键冲突,但初学者容易忘记释放前缀键。
以下是几个最高频的默认按键组合。新建窗口用 Ctrl+b c,切换下一个或上一个窗口用 Ctrl+b n 和 Ctrl+b p,关闭当前窗口用 Ctrl+b &,也就是键盘上的与符号。垂直分割面板用 Ctrl+b %,水平分割面板用 Ctrl+b "。在面板之间移动用 Ctrl+b 方向键,不需要再按前缀键。
# 创建名为 dev 的会话 tmux new -s dev # 列出当前所有会话 tmux ls # 脱离当前会话,回到普通终端 tmux detach # 重新接入 dev 会话 tmux attach -t dev # 杀掉 dev 会话 tmux kill-session -t dev
如果觉得默认按键难记,可以先集中记忆三个动作:创建窗口、切换窗口、脱离会话。脱离会话用 Ctrl+b d,这个操作只是让本地终端与 tmux 会话断开显示,并不会结束运行中的任务。很多运维人员把长时间任务启动后,习惯性按一次 Ctrl+b d 再安全地关闭 SSH 客户端。
会话保持与自动恢复实战
会话保持是 tmux 在运维场景中最实用的能力。假设需要在一台 RHEL 主机上执行数据库迁移脚本,脚本已经运行了 40 分钟,此时本地网络突然闪断。如果没有 tmux,脚本可能直接退出或留下半成品数据。使用 tmux 时,脚本运行在会话内的 Shell 进程中,SSH 断开只会导致客户端脱离,服务端的 tmux server 继续运行。
恢复时重新登录服务器,执行 tmux ls 查看已有会话。如果只有一个会话,直接 tmux attach 即可进入。如果存在多个会话,则需要指定名称,例如 tmux attach -t migrate。进入后会发现脚本的输出、输入历史都完整保留,甚至可以在脱离期间继续产生新的输出。这是因为 tmux 会把面板内容缓存在服务端,重新接入时把缓冲内容一次性刷到客户端。
在批量运维中,还可以借助脚本自动创建会话并执行命令。下面示例在一个名为 backup 的会话中运行数据库备份命令,命令结束后不销毁会话,便于事后查看输出。
tmux new -d -s backup tmux send-keys -t backup 'pg_dump -U postgres appdb > /tmp/appdb.sql' Enter echo "备份任务已在 backup 会话中启动"
这里的 send-keys 命令向指定会话发送按键,Enter 表示执行。这样即使不做手动 attach,也能让命令在会话内运行。需要注意,如果备份命令产生的输出很大,应重定向到文件,避免 tmux 缓冲占用过多内存。
配置调优与高效使用技巧
默认配置已经可用,但通过用户主目录下的 .tmux.conf 文件可以大幅提升效率。推荐先修改前缀键为 Ctrl+a,因为 Ctrl+a 在 Shell 中通常用于跳到行首,冲突更少。配置时需要注意,修改前缀键后原有的 Ctrl+b 将失效,后续说明都以新前缀键为准。
# 解除默认前缀键绑定 unbind C-b # 设置 Ctrl+a 为新前缀键 set -g prefix C-a bind C-a send-prefix # 开启鼠标支持 set -g mouse on # 窗口编号从 1 开始 set -g base-index 1 set -g pane-base-index 1 # 更友好的状态栏颜色 set -g status-bg black set -g status-fg cyan
配置完成后重新加载配置文件或重启会话即可生效。执行 tmux source-file ~/.tmux.conf 可以在不退出会话的情况下应用新配置。鼠标支持开启后,可以直接点击面板切换焦点,拖动边框调整面板大小,用滚轮查看历史输出,这对刚接触 tmux 的用户非常友好。
另一个实用技巧是给窗口和面板命名。通过 tmux rename-window monitor 可以给当前窗口改名,通过 Ctrl+a , 可以交互式修改。面板命名没有默认快捷键,但可以通过脚本或自定义绑定实现。给窗口命名后,状态栏显示的信息更直观,多任务切换时不容易混淆。
在 RHEL 服务器上长期使用 tmux 时,建议将会话数量控制在合理范围。虽然 tmux server 可以管理多个会话,但每个会话都会占用一定的内存和文件描述符。定期用 tmux ls 检查并清理不再使用的会话,例如 tmux kill-session -t backup,可以保持系统状态清晰。
总结
tmux 的核心价值不在界面花哨,而在于把终端会话变成可以断开、重连、分割和复用的独立工作单元。在 RHEL 环境下,借助 dnf 安装和少量配置,就能显著减少因 SSH 不稳定导致的任务中断问题。掌握创建会话、脱离会话和 attach 恢复这三个基础动作,已经能覆盖多数运维场景。
从窗口管理到面板分割,再到通过 send-keys 自动化执行命令,tmux 给终端操作提供了一套完整的抽象层。对于需要同时管理多台服务器、运行长时间脚本或保持远程调试现场的工程师来说,把 tmux 作为默认终端环境的一部分,会是一个低投入高回报的选择。