大家有没有遇到过这样的场景远程登录 Linux 服务器跑一个数据导出任务中间去喝了杯水回来发现 SSH 窗口已经断线重新连上去后任务也没了日志停在一半。很多人第一反应是“网络太差”但这个问题的本质不是网络而是你启动的进程没有和 SSH 会话“解绑”。在 Linux 服务器上做开发、运维screen 和 tmux 几乎是绕不开的两个工具。它们的核心能力叫“会话保持”session persistence简单说就是让任务在终端断开后继续运行等你下次登录时还能重新接回现场。本文会把两者的原理、常用命令、配置文件、实战场景和报错排查完整梳理一遍适合刚接触 Linux 的新手也适合想系统整理命令的老手。1. 为什么需要 screen / tmux先理解“会话保持”1.1 SSH 断线为什么会把任务带走在正式介绍命令之前先补一个底层概念终端与进程之间的关系。当你通过 SSH 登录到 Linux 服务器时sshd 会为你分配一个伪终端pty你随后执行的 shell 以及 shell 里启动的子进程都挂在这个终端下。终端不只是一个“显示窗口”它还承担着进程组的控制职责。当 SSH 连接异常断开时终端会话会结束内核或 shell 会向相关进程发送 SIGHUP 信号。所谓 HUP就是 hang up也就是“挂断”。进程收到这个信号后默认行为就是退出。所以你会看到这样的现象一个脚本明明已经脱离前台在后台跑着但 SSH 窗口一关它也停了。原因就是它仍然从属于那个即将消失的终端会话无法独善其身。很多人会用nohup来解决问题。nohup的本质是让进程忽略 SIGHUP它确实能让任务继续跑但它的不足也很明显一旦进程启动你很难再回到它面前查看输出、输入命令日志只能靠重定向到文件。对于“跑起来还要持续观察、偶尔交互”的需求nohup并不理想。1.2 终端复用器是怎么做到“断了还能接回来”的screen 和 tmux 属于同一类工具术语叫终端复用器terminal multiplexer。它们解决的正是“终端断连导致进程死亡”和“一个终端同时干多件事”这两个问题。它们的工作方式可以这样理解你执行screen或tmux后系统会启动一个后台守护进程这个进程独立于当前 SSH 终端存在。你在屏幕上看到的是“客户端视图”而真正运行命令的是后台守护进程。SSH 断开时断掉的只是客户端后台进程毫发无损。等你重新登录再通过恢复命令把客户端接回去即可。这种设计还有一个附带好处一个会话里可以开多个窗口甚至把屏幕分成多个窗格同时查看日志、编辑文件和执行命令。这也是为什么这类工具在服务器运维、远程开发、面试题里出现频率都极高。1.3 screen 和 tmux 的关系screen 是 GNU 出品的经典工具诞生时间早几乎在所有 Linux 发行版和旧服务器上都有预装。tmux 是后起之秀功能更强配置更现代但在极简安装的服务器上可能需要手动安装。两者不是水火不容的关系更准确地说是“一个古老稳定、一个现代强大”。本文后面会分别精讲再给出选型建议。无论你最终常用哪一个先弄懂其中一个另一个上手都会很快因为核心概念和操作逻辑高度相似。2. 环境准备与基础检查2.1 检查系统是否已经安装在 Linux 终端里执行下面的命令判断当前环境是否已经安装了 screen 或 tmuxwhich screen screen -v which tmux tmux -V如果命令能正常输出路径和版本号说明已经安装。不同的发行版、不同的软件源版本差异较大本文不会绑定某个特定版本而是以最常见的命令行为例展开。版本差异不会影响核心功能但如果你在很老的系统上遇到参数不兼容优先参考系统自带的 man 手册。2.2 安装 screen 和 tmux在 CentOS / RHEL / Rocky Linux 等使用 yum 的发行版上可以用下面命令安装sudo yum install -y screen tmux在 Ubuntu / Debian 等使用 apt 的发行版上执行sudo apt update sudo apt install -y screen tmux如果你使用的是 macOS 开发机可以用 Homebrew 安装brew install screen tmux安装完成后再次执行版本检查命令看到版本号即代表安装成功。这里想提醒一点如果你所在公司的服务器有软件源限制或者当前用户没有 sudo 权限请先向系统管理员确认安装策略不要在未授权的生产环境中随意装包。毕竟我们的目标是解决任务保持问题不是引入新的合规风险。3. GNU Screen 命令精讲3.1 创建会话、脱离与恢复最核心的三个动作screen 最常用的方式只有三步创建会话、脱离会话、恢复会话。第一步创建一个指定名称的会话screen -S build-S build表示给会话命名为 build。命名在多个会话同时存在时非常重要否则你只能靠难记的进程编号去区分它们。执行该命令后你会进入一个看起来和平时终端没有区别的界面。此时你运行的任何命令都会在这个会话里执行。比如你可以接着运行编译任务cd /opt/project make任务开始执行后如果想临时离开又不想中断任务就按脱离快捷键Ctrla d这里的Ctrla是 screen 的默认命令前缀键输入时不显示任何字符紧接着按字母dscreen 会回到原来的终端并输出一行提示表示会话已经脱离。第二步查看当前有哪些 screen 会话screen -ls输出中会列出所有会话的编号、名称和状态。状态
