screen命令

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 nCtrl+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 会话
  • 结合其他工具(如watchtail等)可以创建强大的监控系统