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-9 | Ctrl+a 0 到 Ctrl+a 9 |
| 重命名当前窗口 | Ctrl+a A |
| 关闭当前窗口 | exit 或 Ctrl+a k |
| 查看帮助 | Ctrl+a ? |
| 进入复制/滚动模式 | Ctrl+a [ |
| 粘贴复制内容 | Ctrl+a ] |
发送真正的 Ctrl+a | Ctrl+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
例如可以把窗口命名为:
editorserverlogsdb
这样在一台服务器上工作时会清楚很多。
分屏
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,因为很多机器上直接可用。 - 日常开发环境:优先
tmux或zellij,分屏和布局更舒服。 - 生产服务守护:不用 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 ? # 帮助