screen 命令速查表 - 终端会话管理常用命令大全
SSH 断线时正在跑的编译、被误关的编辑现场,本质损失都来自会话与网络连接绑定;screen 和 tmux 都是在终端本地再挂一层持久会话,让程序活在网络之外。选 screen 是因为它几乎在所有发行版和 macOS 上已预装,且会话模型足够简单:screen -S 名字 新建命名会话,Ctrl-a d 分离,screen -r 名字 重新接入。窗口与分屏两组对应窗口切换(Ctrl-a c 新建、n/p 前后翻)与垂直水平切分(Ctrl-a S、Ctrl-a |)。复制模式最容易卡住——screen 没有系统级选择复制,必须 Ctrl-a [ 进入 copy mode,y 复制,再 Ctrl-a ] 粘贴。与 tmux 的分界:需要插件、脚本化布局或共享会话时 tmux 更好;不想装、或要快速接管遗留会话时 screen 更省事。
典型使用场景
面向需要在 SSH 断线后任务还能继续跑的场景:线上编译、训练任务、tail -f 日志、临时隧道。screen 在最小化容器、老旧发行版、嵌入式设备里几乎总有,而 tmux 常常没有,所以它是「保底可用」的那一个。真正值得掌握的不是快捷键列表,而是会话生命周期:创建、脱离、找回、彻底结束这四步。其中 `screen -RD` 几乎可以替代你记忆中的所有恢复命令——它先踢掉别人(比你)占着的会话再接上去,不会报 "already attached"。
会话管理 Session 8
screen -S namescreen -lsscreen -r namescreen -d namescreen -x namescreen -X -S name quitCtrl+a dscreen -RD name窗口 Window 8
Ctrl+a cCtrl+a n / pCtrl+a 0-9Ctrl+a ACtrl+a kCtrl+a wCtrl+a "Ctrl+a Ctrl+a分屏 Split Screen 5
Ctrl+a SCtrl+a |Ctrl+a TabCtrl+a XCtrl+a Q复制模式 Copy Mode 6
Ctrl+a [SpaceEnterCtrl+a ]Ctrl+a EscPageUp / PageDown其他操作 Other 5
Ctrl+a ?Ctrl+a :Ctrl+a HCtrl+a xscreen -dmS name cmd配置 .screenrc Configuration 6
startup_message offdefscrollback 10000term xterm-256colorescape ^Bbscreen -t editor 1 vimcaption always "%n %t"参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
screen -dmS name cmd | 后台创建会话并直接执行命令,不占用当前终端,最常用的一次性后台任务写法 | screen -dmS name cmd |
screen -RD name | 强制分离远端会话并附加进来,恢复会话的首选,附加失败也不报错 | screen -RD name |
screen -x name | 同时附加到已附加的会话,多人共享同一屏(排障时让两个人看同一份输出) | screen -x name |
screen -X -S name quit | 从会话外部直接结束指定会话,不需要先进去再 exit | screen -X -S name quit |
Ctrl+a d | 脱离当前会话而进程继续运行;注意不是 Ctrl+a k(那会杀掉窗口) | Ctrl+a d |
易错点与避坑指南
现象screen -r name 报 "There is a screen on: xxx attached",接不进去。
原因该会话还挂在一个已断线的终端上,screen 认为它被占用。
处置改用 screen -RD name 强制分离后附加;需要同时看就 screen -x name。
现象想「挂后台跑个任务」,结果 Ctrl+a k 把整个任务一起杀掉了。
原因Ctrl+a d 是脱离(进程继续),Ctrl+a k 是关闭窗口(进程终止),两者一字之差。
处置一律用 Ctrl+a d 脱离;结束会话用 screen -X -S name quit。
现象日志往上翻,输出没几天就滚没了,PageUp 翻不到头。
原因默认回滚缓冲区只有几百行。
处置在 ~/.screenrc 里写 defscrollback 10000 扩大缓冲区。
现象竖直分屏 Ctrl+a | 按了没反应,只在某些机器上能用。
原因竖直分屏需要 screen 4.1 及以上,老版本只有水平分屏 Ctrl+a S。
处置先确认版本:screen -v;老版本改用 Ctrl+a S 做上下分屏。
现象每次进来都被版权提示刷屏,输出被顶掉几行。
原因screen 启动时默认打印 startup_message。
处置~/.screenrc 里写 startup_message off。
排障路径
1找回一个「不见了」的会话
screen -ls && screen -RD name-ls 先确认会话名与状态;-RD 强制分离并附加,附加冲突时同样有效。
2清理已经没有用的会话
screen -X -S name quit会话已附着时先 screen -d name 脱离,否则里面还在跑的进程会一起被终止。
3让两个人同时看同一屏输出
screen -x name配合 Ctrl+a S / Ctrl+a | 分屏,两人各看一半。
命令示例
建会话、列出、恢复的标准三步
screen -dmS build bash
screen -ls
screen -RD buildscreen -dmS name cmd 在后台建会话并直接执行命令,配合 screen -ls 确认状态、screen -RD 恢复。-d 让 screen 立刻 detach 所以不会占住当前终端;-R 做不到时 -D 会踢掉其它已连接的终端——共享一台机器时这正是你想要的强制恢复。
输出
There are screens on: 1.build (Detached) 1 Socket in /run/screen/S-user. 4582.build (Detached) 1 Socket in /run/screen/S-user.
分屏跑编译与看日志
# 在 screen 会话内依次执行:
# Ctrl+a S 水平分屏(上下)
# Ctrl+a Tab 切换焦点
# Ctrl+a X 关闭当前分屏「一边跑 npm run build,一边 tail 日志」这种双屏需求正是 screen 存在的理由。注意 Ctrl+a S 产生的是上下分屏,Ctrl+a | 才是左右分屏(需 screen 4.1+);关闭分屏用 X,只留当前用 Q。
改前缀键与滚屏设置写进 .screenrc
escape ^Bb
defscrollback 10000
startup_message off
term xterm-256color把 escape ^Bb 写进 ~/.screenrc 可把前缀键改成 Ctrl+b,避开与 Emacs/Ctrl-a 类绑定的冲突。defscrollback 默认只有几百行,长时间编译的输出会被截断,10000 行更实用。改完前缀键后所有 Ctrl+a 都要相应改成 Ctrl+b。
复制模式里翻页并取日志片段
# Ctrl+a [ 进入复制模式
# PageUp / PageDown 翻页
# Space 开始选择,Enter 复制
# Ctrl+a ] 粘贴到任意 shellscreen 里用鼠标滚轮翻历史常常无效,正确的入口是复制模式(Ctrl+a [)。选定并回车后内容进入独立缓冲区,再用 Ctrl+a ] 粘到当前 shell —— 这是从长输出里取中间几行的唯一稳妥办法。
退出前先看有哪些会话残留
screen -ls
screen -X -S build quit
screen -X -S deploy quit会话「Detached」时里面的进程仍在跑。养成离开前 screen -ls 的习惯,避免训练任务、编译进程在无人看管的会话里占着 CPU。需要真正结束就 screen -X -S name quit;只脱开用 Ctrl+a d 或 screen -d name。
常见坑与注意事项
- screen -X -S name quit 会直接杀掉会话内的所有进程,不给任何保存机会。跑着的训练任务、编译、未保存的 vim 都会随会话一起消失——先 Ctrl+a [ 检查,或在会话里跑 nohup/tmux 做二级保护。
- SSH 断开时 screen 能救你,但网络真断时 screen 也可能留下「Detached 且已僵死」的会话。下次回来用 screen -RD 强制接管时,会把原进程留在原地重新 attach,容易出现两份进程同时写同一份输出的情况。
- Ctrl+a 是终端的发送中断(XON)字符,流式输出时按它会「吃掉」后续输出而不是触发快捷键。表现就是「按了没反应」,解法是关掉终端流控(stty -ixon)或把前缀键改掉。
- 默认 defscrollback 缓冲区只有几百行,长输出用「上翻」根本翻不到开头,复制模式也取不到。改 ~/.screenrc 的 defscrollback 之后必须新建会话才生效。
- screen -r 在「会话已被别人 attach」时会直接报 There is only one screen,浪费时间排查。真正好用的是 screen -RD(-R 恢复、失败则 -D 踢掉原客户端),全用 -R 会经常白跑一趟。
- screen 与 tmux 都占着同一份终端快捷键语义:Ctrl+a d 在 tmux 里含义完全不同。混用两者的机器上,误以为在 screen 却发到 tmux(或反之)会表现为「快捷键完全无效」,而不是任何报错。
提示
- SSH 断线后 screen 会话不丢失,重新 ssh 后 screen -r 即可恢复,远程开发必备。
- Ctrl+a 是默认前缀键,如果和终端快捷键冲突可在 ~/.screenrc 中改。
- screen 功能较老,新项目建议用 tmux(更现代、支持插件)。
- screen -ls 列出会话名与时间戳,配合 screen -x -S 名字 可与他人共享同一会话同时键入,排障联调时很实用。
- screen -S 名字 -X quit 从脚本里直接关闭某个会话,比进会话再 exit 稳,适合在 crontab 或 CI 里清理遗留会话。
- 在 .screenrc 里写 startup_message off 可以去掉连上时的版本横幅,配合 defscrollback 10000 提高回滚行数。
常见问题
想让一条命令在后台自己跑完,怎么用 screen 拉起来?
用 screen -dmS name cmd:-d 表示立即分离、不占当前终端,-mS 表示创建一个名为 name 的会话并在其内部执行 cmd。命令跑完后会话自动结束,终端立刻还给你,适合放进 crontab、CI 步骤或任何不希望阻塞当前终端的场景。命名这一步别省,会话名会出现在 screen -ls 的列表里,出问题时能一眼定位到是哪个任务。执行期间想看进展就 screen -r name 接进去,看完 Ctrl+a d 再脱离,任务不受影响。
每次新开 screen 都想自动分好窗口并进入 vim,怎么配置?
在 ~/.screenrc 里写 screen -t editor 1 vim,-t editor 给窗口起名,1 指定它是 1 号窗口,vim 是这个窗口里自动执行的命令。启动时 screen 会先把这条命令建出来,你连进去就已经在 vim 里,不用再手动开窗口敲命令。把窗口命名这一步做进配置还有个附带好处:状态栏配合 caption always "%n %t" 会持续显示编号和标题,你在多窗口之间切换时不会认错当前窗口。
改了前缀键之后,原来的快捷键还能用吗?
不能直接用,全部要跟着换前缀。配置文件里的 escape ^Bb 是修改前缀键的命令,把 Ctrl+a 换成 Ctrl+b,写完之后所有命令都要写成 Ctrl+b d、Ctrl+b c、Ctrl+b S 这样。screen 还保留了一条兜底:连按两次 Ctrl+b 本身,就等价于旧的 Ctrl+a Ctrl+a,也就是在当前和上一个窗口间切换。刚改完前缀觉得不适应时,可以把这条双击路径当成临时通道。另外 term xterm-256color 这行值得一起写上,它让 screen 内部与外部终端在颜色数量上对齐,否则 256 色终端会被降级显示。
复制模式的一次完整操作是怎么走的?
五步:先按 Ctrl+a [ 进入复制模式,此时可以用 PageUp / PageDown 往上翻历史输出;定位到要复制的位置后按 Space 开始选择,方向键或鼠标拖动调整范围;选好后按 Enter 把选中内容复制并退出选择状态;再按 Ctrl+a ] 把最近一次复制的内容粘贴到当前光标处;最后如果还要回到命令模式,按 Ctrl+a Esc 退出复制模式。整个流程的价值在于它复用的是 screen 自己的回滚缓冲区,所以哪怕内容早已滚出屏幕,只要缓冲区还在就能捞回来。
窗口太多了,几种切换方式该怎么选?
按切换意图挑。Ctrl+a n 和 Ctrl+a p 是在相邻窗口之间走一步,适合顺手上一个下一个;Ctrl+a 0-9 是直跳,编号一敲就到目标,是窗口数不多时最快的方式。Ctrl+a Ctrl+a 只在最近两个窗口之间来回切,手头同时盯两三个服务日志时最省事,连按两次前缀键即可。Ctrl+a " 是交互式选择,会列出全部窗口让你挑,窗口超过十个、编号已经记不住时靠它;Ctrl+a w 同样是列表视图,但它只看不切,适合先确认自己在哪个窗口。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。