你是否曾在远程机器上启动了一个长时间运行的任务,却因失去连接而导致 SSH 会话结束,从而丢失了所有进度?这是我们许多人常遇到的烦恼。GNU Screen 是一个终端复用器,正好解决了这个问题。即使断开连接,它也能保持你的会话运行,让你能够从头开始的地方继续。

本指南将解释如何安装 Screen、管理会话和窗口、分离和重新连接、使用滚动缓冲区模式,以及如何通过配置文件自定义 Screen。

提示:tmux 是 Screen 的现代替代品,具有类似的功能以及更好的窗口管理和脚本支持等额外功能。这两种工具都是管理终端会话的优秀选择。

安装 Linux Screen

screen 包在大多数 Linux 发行版中已预装。要检查是否可用,请运行:

终端

screen --version

输出

Screen version 4.09.01 (GNU) 20-Aug-23

如果系统中未安装 screen,请使用发行版的包管理器进行安装。

在 Ubuntu、Debian 及其衍生版上安装 Linux Screen

终端

sudo apt update && sudo apt install screen

在 Fedora、RHEL 及其衍生版上安装 Linux Screen

终端

sudo dnf install screen

启动 Screen 会话

要启动新的 Screen 会话,请在终端中输入以下内容:

终端

screen

这将打开一个 Screen 会话,创建一个新的窗口,并在其中启动一个 shell。要在会话中查看所有可用的键绑定,请按 Ctrl+a ?。

启动命名会话

当同时运行多个 screen 会话时,命名会话非常有用。要创建命名会话,请运行:

终端

screen -S session_name

选择一个能反映其中运行任务的描述性会话名称总是个好主意。这使以后更容易识别和管理多个会话。

启动后台运行命令的分离会话

要启动一个从开始就处于分离状态并在后台运行命令的会话,请使用 -dmS:

终端

screen -dmS backup rsync -av /home /backup

这在 SSH 中非常有用,当你想要启动一个长时间运行的任务并立即断开连接时,无需手动分离和重新连接。会话会显示在 screen -ls 中,你可以稍后用 screen -r backup 重新连接。

处理 Screen 窗口

当你启动一个新的 Screen 会话时,它会创建一个包含 shell 的单个窗口。你可以在同一会话中的任何时间打开额外的窗口。

要创建新窗口,请按 Ctrl+a c。Screen 会将范围 0–9 中的第一个可用数字分配给新窗口。

以下是管理窗口的最常见键绑定:

  • Ctrl+a c — 创建新窗口(带 shell)。
  • Ctrl+a " — 列出所有窗口。
  • Ctrl+a 0 — 切换到窗口 0(按编号)。
  • Ctrl+a A — 重命名当前窗口。
  • Ctrl+a k — 杀死当前窗口。
  • Ctrl+a S — 将当前区域水平分割为两个区域。
  • Ctrl+a | — 将当前区域垂直分割为两个区域。
  • Ctrl+a Tab — 将输入焦点切换到下一个区域。
  • Ctrl+a Ctrl+a — 在当前和上一个窗口之间切换。
  • Ctrl+a Q — 关闭除当前区域外的所有区域。
  • Ctrl+a X — 关闭当前区域。

从 Screen 会话分离

你可以通过按以下键随时从 screen 会话分离:

Ctrl+a d

分离后,会话内运行的程序将继续运行。你可以安全地关闭终端或断开 SSH 会话。

重新连接到 Screen 会话

要恢复分离的会话,请运行:

终端

screen -r

如果你有多个 screen 会话在运行,你需要指定会话 ID。要列出所有运行的会话,请运行:

终端

screen -ls

输出

There are screens on:
    10835.pts-0.linuxize-desktop   (Detached)
    10366.pts-0.linuxize-desktop   (Detached)
2 Sockets in /run/screens/S-linuxize.

要重新连接到特定会话,将其 ID 传递给 -r 选项:

终端

screen -r 10835

如果会话仍标记为 (Attached)-d -r 先将其分离,然后再重新连接:

终端

screen -d -r 10835

滚动缓冲区和复制模式

默认情况下,Screen 不允许使用鼠标滚轮滚动。要滚动查看之前的输出,请按以下键进入滚动缓冲区模式:

Ctrl+a [

在滚动缓冲区模式中,使用方向键或 Page Up / Page Down 导航通过输出缓冲区。要复制文本,请按 Space 标记选择的开始位置,将光标移动到末尾,然后再次按 Space 进行复制。要粘贴复制的文本,请按:

Ctrl+a ]

按 q 或 Escape 在不复制的情况下退出滚动缓冲区模式。

终止 Screen 会话

要干净地关闭 Screen 会话,请在每个打开的窗口中输入 exit。当最后一个窗口关闭时,会话会自动结束。

要从外部强制终止命名会话,请使用 -X 标志发送 quit 命令:

终端

screen -X -S session_name quit

要按 ID 终止会话,请将 session_name 替换为 screen -ls 显示的会话 ID。

清理死会话

如果 screen 进程崩溃或主机重启,screen -ls 可能会继续列出会话,好像它仍然存在。要删除这些陈旧条目,请运行:

终端

screen -wipe

这将删除任何其后台进程不再存活的会话套接字。保留活动的会话不受影响。

自定义 Linux Screen

Screen 启动时,它会从 /etc/screenrc 和 ~/.screenrc 读取配置。你可以通过编辑 ~/.screenrc 来修改默认设置。

以下是一个带有自定义状态行和一些有用选项的示例配置:

~/.screenrccfg

# Turn off the welcome message
startup_message off

# Disable visual bell
vbell off

# Set scrollback buffer to 10000
defscrollback 10000

# Customize the status line
hardstatus alwayslastline
hardstatus string '%{= kG}[%{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'

GNU Screen terminal with customized status line

快速参考

会话命令:

CommandDescription
screen启动新会话
screen -S name启动命名会话
screen -ls列出所有会话
screen -r重新连接到分离的会话
screen -r session_id按会话 ID 重新连接
screen -d -r session_id分离并重新连接到会话
screen -X -S name quit强制终止命名会话

键绑定(在会话内):

Key bindingDescription
Ctrl+a c创建新窗口
Ctrl+a "列出所有窗口
Ctrl+a 0–9按编号切换到窗口
Ctrl+a A重命名当前窗口
Ctrl+a k终止当前窗口
Ctrl+a d从会话分离
Ctrl+a [进入滚动缓冲区模式
Ctrl+a ]从滚动缓冲区粘贴
Ctrl+a ?显示所有键绑定

如需可打印的快速参考,请参阅 Screen 速查表。

故障排除

There is no screen to be resumed
不存在分离的会话。运行 screen -ls 查看所有会话。如果会话显示 (Attached)screen -d -r session_id 将其从陈旧连接中分离并重新连接。

必须以 suid root 运行以支持多用户
screen 二进制文件没有所需的权限。在 Ubuntu 和 Debian 上,重新安装该包以恢复权限:sudo apt reinstall screen。

无法重新附加到由其他用户创建的会话
Screen 会话是特定于用户的。您必须以创建会话的同一用户身份登录。要在用户之间共享会话,请在 Screen 内部使用 Ctrl+a :multiuser on 启用多用户模式,然后使用 Ctrl+a :acladd username 授予访问权限。

常见问题解答

Screen 和 tmux 有什么区别?
两者都是终端复用器,可在断开连接后保持会话存活。tmux 具有更活跃的开发周期、更清晰的配置和更好的窗格管理。Screen 预安装更为广泛。对于新设置,tmux 通常是更好的选择。

如何在 Screen 中向上滚动?
按 Ctrl+a [ 进入回滚模式,然后使用方向键或 Page Up / Page Down 进行导航。按 q 或 Escape 退出。

如何在两个用户之间共享 Screen 会话?
在会话内部运行 Ctrl+a :multiuser on,然后运行 Ctrl+a :acladd username。另一个用户可以使用 screen -x session_id 附加到该会话。

如何将 Screen 会话记录到文件中?
按 Ctrl+a H 切换日志记录。Screen 将输出写入名为 screenlog.N 的文件,位于您的主目录中,其中 N 是窗口编号。