GNU Screen 是一个老牌终端复用器,作用和 tmux、zellij 类似:可以在一个终端里管理多个窗口,也可以让程序在后台继续运行。最常见的场景是 SSH 到服务器后启动一个长期任务,断开连接以后任务不受影响,之后再重新连回去查看状态。

Screen 没有 tmux 和 zellij 那么现代,但优点是很多服务器默认就装了,命令也很稳定。临时在服务器上跑脚本、编译项目、下载文件、看日志,用它非常方便。

安装

Debian / Ubuntu:

sudo apt install screen

CentOS / Rocky Linux / AlmaLinux:

sudo dnf install screen

macOS:

brew install screen

查看版本:

screen --version

会话管理

创建会话

直接进入一个新的 screen 会话:

screen

创建命名会话,推荐这样用:

screen -S myproject

会话名很重要。服务器上同时跑多个任务时,用名字更容易区分。

列出会话

screen -ls

常见输出类似:

There are screens on:
        12345.myproject    (Detached)
        12346.deploy       (Attached)

状态含义:

  • Detached:会话在后台运行,可以重新连接。
  • Attached:会话正在某个终端里打开。

断开会话

在 screen 里按:

Ctrl+a d

意思是 detach。断开后,当前终端会回到普通 shell,但 screen 里的程序还在后台运行。

重新连接

连接到指定会话:

screen -r myproject

如果只有一个 detached 会话,也可以直接:

screen -r

如果会话显示 Attached,但之前的 SSH 已经断了,可以强制从旧终端分离并连接到当前终端:

screen -d -r myproject

也可以使用更强一点的写法:

screen -D -R myproject

这条命令的意思是:如果会话存在就连接;如果它被别的终端占用,就先分离再连接。

删除会话

进入会话后,正常退出里面的 shell:

exit

也可以在外部关闭指定会话:

screen -S myproject -X quit

如果只是某个程序卡住了,优先进入会话里处理,不要直接杀会话。

后台启动命令

创建一个 detached 会话并直接运行命令:

screen -dmS build cargo build --release

运行服务:

screen -dmS api ./target/release/gateway

运行脚本:

screen -dmS job bash run.sh

之后查看:

screen -ls
screen -r job

这种方式适合服务器上临时跑长任务,比如编译、数据导入、下载大文件等。

常用快捷键

Screen 默认前缀键是 Ctrl+a。使用方式是先按 Ctrl+a,松开后再按后面的键。

功能快捷键
分离会话Ctrl+a d
创建新窗口Ctrl+a c
下一个窗口Ctrl+a n
上一个窗口Ctrl+a p
查看窗口列表Ctrl+a "
切换到窗口 0-9Ctrl+a 0Ctrl+a 9
重命名当前窗口Ctrl+a A
关闭当前窗口exitCtrl+a k
查看帮助Ctrl+a ?
进入复制/滚动模式Ctrl+a [
粘贴复制内容Ctrl+a ]
发送真正的 Ctrl+aCtrl+a a

注意:Screen 占用了 Ctrl+a。如果你在 shell 里习惯用 Ctrl+a 跳到行首,需要在 screen 里按 Ctrl+a a

窗口管理

Screen 里的窗口类似 tmux 的 window,不是桌面系统窗口。

创建新窗口:

Ctrl+a c

切换窗口:

Ctrl+a n    # 下一个
Ctrl+a p    # 上一个
Ctrl+a 0    # 切换到 0 号窗口
Ctrl+a "    # 显示窗口列表

重命名当前窗口:

Ctrl+a A

例如可以把窗口命名为:

  • editor
  • server
  • logs
  • db

这样在一台服务器上工作时会清楚很多。

分屏

Screen 也支持分屏,不过体验不如 tmux 直观。

水平分屏:

Ctrl+a S

垂直分屏:

Ctrl+a |

在区域之间切换:

Ctrl+a Tab

在新区域里打开一个窗口:

Ctrl+a c

关闭当前区域:

Ctrl+a X

只保留当前区域:

Ctrl+a Q

如果你大量使用分屏,tmux 或 zellij 会更顺手。Screen 的强项还是简单、稳定、服务器上常见。

复制和滚动

进入复制/滚动模式:

Ctrl+a [

进入后可以用方向键、PageUp、PageDown 滚动历史输出。

常用操作:

功能按键
开始选择Space
结束选择并复制Enter
退出复制模式Esc
粘贴Ctrl+a ]

如果只是想看前面的日志,进入 Ctrl+a [ 后滚动即可,不一定要复制。

日志记录

Screen 可以把当前窗口输出写入日志文件。

在会话里开启或关闭日志:

Ctrl+a H

默认会生成类似这样的文件:

screenlog.0

也可以启动时指定日志文件:

screen -L -Logfile deploy.log -S deploy

如果要记录一个长任务:

screen -L -Logfile import.log -dmS import bash import-data.sh

日志记录适合部署、数据迁移、线上排查这类需要留痕的操作。

常用场景

1. SSH 上跑长任务

ssh user@server
screen -S build
cargo build --release

Ctrl+a d 断开。之后重新连接:

ssh user@server
screen -r build

2. 运行临时服务

screen -S api
./target/release/gateway

断开:

Ctrl+a d

查看:

screen -r api

这适合临时测试。正式生产环境建议用 systemd、PM2、supervisor 这类进程管理工具。

3. 一个会话里管理多个任务

screen -S work

然后:

Ctrl+a A    # 重命名当前窗口为 editor
Ctrl+a c    # 新建窗口
Ctrl+a A    # 重命名为 server
Ctrl+a c    # 新建窗口
Ctrl+a A    # 重命名为 logs

之后用 Ctrl+a " 查看窗口列表,用 Ctrl+a n / Ctrl+a p 切换。

4. 旧 SSH 断了,重新接管

有时网络断开后,screen 会话还是 Attached 状态:

screen -ls

这时用:

screen -d -r work

基本就能接回来。

配置文件

Screen 的用户配置文件是:

~/.screenrc

一个简单配置:

# 关闭启动欢迎页
startup_message off

# 增加滚动历史
defscrollback 10000

# 底部状态栏
hardstatus alwayslastline
hardstatus string "%{= kG}%-Lw%{= kW}%n %t%{-}%+Lw %=%Y-%m-%d %c"

# 支持 256 色
term screen-256color

修改配置后,新开的 screen 会话会生效。已有会话不会自动读取新的 .screenrc

和 tmux、zellij 怎么选

简单理解:

工具特点适合场景
screen老牌、稳定、服务器常见临时任务、SSH 后台运行
tmux功能强、配置生态成熟长期终端工作流、分屏、多窗口
zellij现代、布局友好、提示清晰本地开发、喜欢可视化提示

我的习惯是:

  • 服务器临时任务:优先 screen,因为很多机器上直接可用。
  • 日常开发环境:优先 tmuxzellij,分屏和布局更舒服。
  • 生产服务守护:不用 screen,改用 systemd、PM2、supervisor。

速查

# 新建命名会话
screen -S name

# 列出会话
screen -ls

# 重新连接
screen -r name

# 强制接管
screen -d -r name

# 后台启动命令
screen -dmS name command

# 开启日志并指定文件
screen -L -Logfile output.log -S name

# 关闭会话
screen -S name -X quit

最常记住这几个就够了:

Ctrl+a d    # 断开
Ctrl+a c    # 新窗口
Ctrl+a n    # 下一个窗口
Ctrl+a p    # 上一个窗口
Ctrl+a "    # 窗口列表
Ctrl+a [    # 滚动/复制
Ctrl+a ?    # 帮助