screen 命令使用指南
# 📟 GNU Screen 完全使用指南
> 终端复用神器 —— 会话不中断 · 多任务并行 · 远程协作利器
> 即使断开 SSH 连接,任务依然在后台稳定运行,随时恢复。
---
## 🚀 快速入门
### 安装 screen
```bash
# Ubuntu / Debian
sudo apt install screen
# CentOS / RHEL
sudo yum install screen
# macOS
brew install screen
验证安装:screen --version
核心三步骤
| 操作 | 命令 / 快捷键 | 说明 |
|---|---|---|
| 创建会话 | screen -S mytask |
强烈建议命名,便于管理 |
| 分离会话 | Ctrl + A ,然后按 D |
任务在后台继续运行 |
| 恢复会话 | screen -r mytask |
重新连接到后台会话 |
🗑️ 删除 / 终止会话
方法一:在会话内退出(最常用)
# 进入目标会话后直接输入
exit
或按快捷键 Ctrl+A → K 并确认 Y。
方法二:外部命令优雅关闭(不需要进入会话)
# 先查看所有会话
screen -ls
# 终止指定会话(使用名称或ID)
screen -X -S mytask quit
# 或使用ID:screen -X -S 12345 quit
方法三:批量操作与强制清理
# 终止所有 detached 状态的会话
screen -ls | grep Detached | awk '{print $1}' | cut -d. -f1 | xargs -I{} screen -X -S {} quit
# 杀死所有 screen 进程(谨慎!)
killall screen
确认删除成功
screen -ls # 已删除的会话不再显示
⌨️ 核心快捷键大全
所有快捷键以
Ctrl + A(C-a) 为前缀,先按Ctrl+A松开后再按下一个键。
| 快捷键 | 功能说明 | 应用场景 |
|---|---|---|
C-a c |
创建新窗口 | 同一会话中开启多个独立终端 |
C-a p / C-a n |
切换到上一个/下一个窗口 | 窗口间快速导航 |
C-a " |
窗口列表(可视化选择) | 显示所有窗口,方向键选择 |
C-a A |
重命名当前窗口 | 给窗口起有意义的名字 |
C-a d |
分离会话 Detach | 临时离开,进程继续后台运行 |
C-a S |
水平分屏 | 将终端区域上下分割 |
C-a | 或 C-a v |
垂直分屏 | 左右分屏,同时查看多任务 |
C-a Tab |
切换活动区域 | 光标在不同分屏区域跳动 |
C-a Q |
关闭除当前区域外的所有分屏 | 快速恢复单窗口模式 |
C-a X |
关闭当前分屏区域 | 移除当前聚焦的拆分区域 |
C-a [ |
进入复制/回滚模式 | 使用 PgUp/PgDn 翻阅历史输出 |
C-a ] |
粘贴文本 | 将复制模式中选中的文本粘贴 |
C-a ? |
显示帮助菜单 | 忘记快捷键时随时查看 |
🎯 进阶技巧
1. 启动时直接执行命令
screen -S backup bash backup.sh
任务结束后会话自动退出,无需手动干预。
2. 分屏完整工作流
# 1. 进入会话
screen -S dev
# 2. 水平分屏
Ctrl+A S
# 3. 切换到新区域并创建窗口
Ctrl+A Tab
Ctrl+A c
# 4. 垂直分屏(若需要)
Ctrl+A |
# 5. 在不同区域运行不同任务:日志监控、代码编辑、命令执行
3. 多人实时协作
# 用户A
screen -S pair
# 用户B(附加到同一会话)
screen -x pair
两人同时观看/操作同一个会话,适合结对编程或远程教学。
4. 自动记录会话日志
# 启动时开启日志
screen -L -S logtest
# 输出自动保存到 screenlog.0 文件
# 动态开启/关闭日志(进入会话后)
Ctrl+A : log
📋 常用命令速查表
| 命令 | 说明 |
|---|---|
screen -S <name> |
创建并命名会话 |
screen -ls |
列出所有会话 (Attached/Detached) |
screen -r <name|id> |
恢复离线(Detached)会话 |
screen -D -r <name> |
强制接管 Attached 会话(踢掉旧连接) |
screen -X -S <name> quit |
从容终止指定会话 |
screen -X -S <name> kill |
强制杀掉会话(同 quit) |
screen -wipe |
清理已结束但仍残留的死会话 |
screen -dmS <name> <command> |
后台模式启动并执行命令(不进入界面) |
⚠️ 常见问题 & 解决方案
❌ “There is no screen to be resumed matching xxx”
解决:确保会话存在 screen -ls;若状态为 Attached,使用 screen -D -r 会话名 强制接管。
❌ 关闭终端窗口后,我的任务会消失吗?
不会。 只要之前执行过分离(Ctrl+A d)或在 screen 中启动任务后直接关闭终端,任务不会中断。重新 SSH 后用 screen -r 重连即可。
❌ 如何彻底清理所有 screen 会话?
# 终止所有会话
killall screen
# 或逐个清理
screen -ls | grep -v "No Sockets" | awk '{print $1}' | cut -d. -f1 | xargs -I{} screen -X -S {} quit
✅ 最佳实践
- 始终用
-S命名会话,避免遗忘 ID - 长时间任务务必在 screen 中运行,防止网络波动导致中断
- 搭配
crontab使用screen -dmS实现稳健的后台任务调度 - 删除前先
screen -ls确认,避免误杀重要作业 - 利用分屏提升多任务处理效率
🧪 场景演练:一条龙
# 场景1:部署服务并分离
screen -S webapp
npm run start
# Ctrl+A, d 分离
# 场景2:排查问题(分屏监控日志)
screen -r webapp
# Ctrl+A, c 新建窗口运行 htop
# Ctrl+A, Tab 回到原窗口
# Ctrl+A, S 水平分屏,下方运行 tail -f error.log
# 场景3:结束会话
screen -r webapp
exit # 会话终止,所有子窗口关闭
📌 快速参考卡
screen -S task # 创建会话
screen -ls # 查看所有会话
screen -r task # 恢复会话
Ctrl+A , D # 分离会话
exit # 退出并终止会话
screen -X -S task quit # 外部终止会话
掌握 screen,让命令行工作流具备真正的弹性 —— 无论网络波动还是终端崩溃,工作永不丢失。