screen 命令 #
screen
命令是一个终端多路复用器,允许用户在一个终端窗口中创建、访问和控制多个终端会话。它特别适用于远程服务器管理、长时间运行的任务和需要持久会话的场景。
语法 #
screen [选项] [命令 [参数...]]
常用选项 #
选项 | 描述 |
---|---|
-S 会话名 |
创建一个新的会话并指定名称 |
-r [会话名] |
重新连接到一个分离的会话 |
-d [会话名] |
分离一个会话 |
-ls 或 -list |
列出所有会话 |
-x [会话名] |
连接到一个会话(即使它已经被连接) |
-R [会话名] |
重新连接到会话,如果不存在则创建 |
-D [会话名] |
分离并重新连接到一个会话 |
-m |
强制创建新会话,即使已经在 screen 会话中 |
-d -m |
启动一个会话但不连接到它(后台启动) |
-L |
开启日志功能 |
-h 行数 |
设置历史回滚缓冲区大小 |
-v |
显示版本信息 |
-wipe |
清除死亡会话的状态信息 |
常用键盘快捷键 #
所有 screen 命令都以按下Ctrl+a
(通常写作C-a
)开始,然后按下另一个键:
快捷键 | 描述 | |
---|---|---|
C-a c |
创建一个新窗口 | |
C-a n |
切换到下一个窗口 | |
C-a p |
切换到上一个窗口 | |
C-a 数字 |
切换到指定编号的窗口 | |
C-a " |
显示所有窗口列表 | |
C-a A |
重命名当前窗口 | |
C-a d |
分离当前会话 | |
C-a D D |
分离并注销(快速退出) | |
C-a ? |
显示帮助信息 | |
C-a [ |
进入复制模式(使用空格键开始/结束选择) | |
C-a ] |
粘贴复制的内容 | |
C-a S |
水平分割当前区域 | |
`C-a | ` | 垂直分割当前区域 |
C-a Tab |
切换到下一个区域 | |
C-a X |
关闭当前区域 | |
C-a Q |
关闭除当前区域外的所有区域 | |
C-a k |
杀死当前窗口 | |
C-a \ |
杀死所有窗口并终止会话 | |
C-a z |
挂起 screen 会话 | |
C-a H |
开始/停止记录日志 | |
C-a M |
监视当前窗口活动 | |
C-a _ |
监视窗口是否不活动 | |
C-a : |
进入命令模式 |
常见用法 #
1. 创建新的 screen 会话 #
screen
2. 创建命名的 screen 会话 #
screen -S session_name
3. 列出所有 screen 会话 #
screen -ls
4. 重新连接到分离的会话 #
screen -r session_name
或者如果只有一个会话:
screen -r
5. 分离当前会话 #
按下 Ctrl+a
然后按 d
。
6. 在后台启动 screen 会话 #
screen -d -m command
7. 在后台启动命名的 screen 会话 #
screen -d -m -S session_name command
8. 分离并重新连接到会话 #
screen -D -r session_name
9. 终止一个会话 #
screen -X -S session_name quit
10. 向 screen 会话发送命令 #
screen -S session_name -X command
实用示例 #
1. 运行长时间任务 #
screen -S backup
# 在screen会话中
tar -czf backup.tar.gz /important/data
# 按 Ctrl+a 然后按 d 分离会话
稍后重新连接:
screen -r backup
2. 在远程服务器上运行持久任务 #
ssh user@server
screen -S server_task
# 运行长时间任务
# 分离会话 (Ctrl+a d)
# 安全断开SSH连接
稍后重新连接:
ssh user@server
screen -r server_task
3. 在后台启动服务 #
screen -d -m -S webserver python -m http.server 8000
4. 创建多窗口工作环境 #
screen -S dev
然后:
- 按
Ctrl+a c
创建新窗口 - 按
Ctrl+a "
查看窗口列表 - 按
Ctrl+a A
重命名窗口 - 使用
Ctrl+a n
和Ctrl+a p
在窗口间切换
5. 分割屏幕 #
在 screen 会话中:
- 按
Ctrl+a S
水平分割 - 按
Ctrl+a |
垂直分割 - 按
Ctrl+a Tab
在分割区域间切换 - 按
Ctrl+a c
在当前区域创建新窗口
6. 监视输出变化 #
screen -S monitor
# 在screen会话中
tail -f /var/log/syslog
# 按 Ctrl+a M 开启监视
# 分离会话
7. 共享会话(多用户模式) #
首先启用多用户模式:
screen -S shared
# 在screen会话中按 Ctrl+a :
# 输入 multiuser on
# 输入 acladd username
其他用户可以连接:
screen -x username/shared
8. 记录会话日志 #
screen -L -S logged_session
或在会话中按 Ctrl+a H
开始记录。
9. 自定义状态栏 #
在 ~/.screenrc
文件中添加:
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]'
10. 批量执行命令 #
向所有窗口发送命令:
# 在screen会话中按 Ctrl+a :
# 输入 at \# stuff "echo Hello to all windows^M"
配置文件 #
Screen 的配置文件位于 ~/.screenrc
。以下是一些常用配置示例:
# 禁用启动消息
startup_message off
# 始终显示状态栏
hardstatus alwayslastline
hardstatus string '%{= kG}[%{G}%H%{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B}%Y-%m-%d %{W}%c%{g}]'
# 增加回滚缓冲区大小
defscrollback 10000
# 自动分离
autodetach on
# 启用UTF-8
defutf8 on
# 设置默认shell
shell -$SHELL
# 启用鼠标滚动
termcapinfo xterm* ti@:te@
# 设置快捷键
bind ' ' windows
bind ^k kill
bind k kill
bind ^r source $HOME/.screenrc
与 tmux 的比较 #
功能 | screen | tmux |
---|---|---|
历史 | 较老,广泛可用 | 较新,功能更丰富 |
分屏 | 支持但不如 tmux 灵活 | 强大且灵活 |
脚本化 | 有限 | 更强大 |
会话共享 | 支持 | 支持 |
配置 | 相对简单 | 更复杂但更强大 |
默认前缀键 | Ctrl+a | Ctrl+b |
可用性 | 几乎所有 Unix 系统 | 需要安装 |
高级用法 #
1. 使用 screen 作为串行终端 #
screen /dev/ttyS0 9600
2. 创建滚动的消息墙 #
screen -d -m -S wall bash -c "while true; do echo 'Message at $(date)'; sleep 5; done"
3. 设置窗口布局 #
# 在screen会话中
# 创建并排列窗口
# 按 Ctrl+a : 然后输入
layout save default
4. 使用 screen 进行演示 #
# 在 ~/.screenrc 中添加
hardcopy_append on
hardcopy_current on
bind h hardcopy
5. 自动重新连接 #
# 在 ~/.bash_profile 中添加
if [ -z "$STY" ]; then
screen -xRR
fi
6. 监控多个日志文件 #
screen -S logs
# 创建多个窗口,每个窗口运行 tail -f 不同的日志文件
# 使用 Ctrl+a " 在它们之间切换
故障排除 #
1. “Cannot open your terminal ‘/dev/pts/0’” #
解决方法:
script /dev/null
screen -r
2. 无法重新连接到会话 #
检查会话是否存在:
screen -ls
如果显示 “Attached”,使用:
screen -D -r session_name
3. 恢复崩溃的会话 #
screen -d -r
4. 清理死亡会话 #
screen -wipe
提示 #
- 使用有意义的会话名称,以便于识别
- 在长时间运行的任务前使用 screen,防止网络中断导致任务终止
- 学习基本的快捷键(特别是创建窗口、切换窗口和分离会话)
- 创建自定义的
.screenrc
文件以提高工作效率 - 使用日志功能记录重要会话
- 对于复杂的窗口布局,考虑使用 tmux
- 定期检查并清理未使用的 screen 会话
- 在共享会话时注意安全性
- 使用
screen -X
可以远程控制 screen 会话 - 结合其他工具(如
watch
、tail
等)可以创建强大的监控系统