你是否曾在远程机器上启动了一个长时间运行的任务,却因失去连接而导致 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+ac— 创建新窗口(带 shell)。Ctrl+a"— 列出所有窗口。Ctrl+a0— 切换到窗口 0(按编号)。Ctrl+aA— 重命名当前窗口。Ctrl+ak— 杀死当前窗口。Ctrl+aS— 将当前区域水平分割为两个区域。Ctrl+a|— 将当前区域垂直分割为两个区域。Ctrl+aTab— 将输入焦点切换到下一个区域。Ctrl+aCtrl+a— 在当前和上一个窗口之间切换。Ctrl+aQ— 关闭除当前区域外的所有区域。Ctrl+aX— 关闭当前区域。
从 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}]'
快速参考
会话命令:
| Command | Description |
|---|---|
screen | 启动新会话 |
screen -S name | 启动命名会话 |
screen -ls | 列出所有会话 |
screen -r | 重新连接到分离的会话 |
screen -r session_id | 按会话 ID 重新连接 |
screen -d -r session_id | 分离并重新连接到会话 |
screen -X -S name quit | 强制终止命名会话 |
键绑定(在会话内):
| Key binding | Description |
|---|---|
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 是窗口编号。