screen 命令

GNU Screen 是一个全屏窗口管理器,它将一个物理终端复用成多个进程,每个进程都有一个独立的交互式终端。Screen 允许用户断开和重新连接到会话,非常适合远程服务器操作和长时间运行的进程。

基本概念

  • 会话 (Session):Screen 的一个运行实例
  • 窗口 (Window):会话中的一个虚拟终端
  • 区域 (Region):分割显示的区域,每个区域显示一个窗口

基本语法

启动 Screen

# 启动一个新的 Screen 会话
screen

# 启动一个命名的 Screen 会话
screen -S session_name

# 启动时指定 shell
screen -S session_name /bin/zsh
screen -S session_name /bin/bash
screen -S session_name /bin/fish

# 启动后立即执行命令
screen command_to_run

# 启动指定 shell 并执行命令
screen /bin/bash -c "command_to_run"

# 查看正在运行的 Screen 会话
screen -ls

Screen 内部快捷键

所有 Screen 快捷键都以 Ctrl + a 开始(称为前缀键):

  • Ctrl + a c:创建新窗口
  • Ctrl + a n:切换到下一个窗口
  • Ctrl + a p:切换到上一个窗口
  • Ctrl + a 0-9:切换到指定编号的窗口
  • Ctrl + a ":显示窗口列表
  • Ctrl + a A:重命名当前窗口
  • Ctrl + a k:关闭当前窗口
  • Ctrl + a d:断开会话但保持运行(detach)
  • Ctrl + a ?:显示帮助信息

常用操作示例

会话管理

# 创建新会话
screen -S myproject

# 查看所有会话
screen -ls

# 重新连接到指定会话
screen -r myproject
screen -r 12345  # 使用会话ID

# 如果会话被占用,强制连接
screen -D -r myproject

# 结束指定会话
screen -X -S myproject quit

窗口操作

# 在 Screen 会话中创建新窗口
Ctrl + a c

# 在不同窗口间切换
Ctrl + a n  # 下一个窗口
Ctrl + a p  # 上一个窗口
Ctrl + a 1  # 切换到窗口1

# 显示所有窗口列表
Ctrl + a "

# 重命名当前窗口
Ctrl + a A

# 分割屏幕(水平)
Ctrl + a S

# 在分割的区域间切换
Ctrl + a Tab

# 在当前区域显示其他窗口
Ctrl + a :other

# 取消分割
Ctrl + a X

实用场景

长时间运行进程

# 启动 Screen 会话
screen -S backup

# 在会话中运行长时间任务
rsync -av --progress /source/ /destination/

# 断开会话(任务继续运行)
Ctrl + a d

# 稍后重新连接查看进度
screen -r backup

多任务并行处理

# 启动 Screen 会话
screen -S work

# 在第一个窗口运行服务
cd /path/to/service
./service.sh

# 创建新窗口
Ctrl + a c

# 在第二个窗口监控日志
tail -f /var/log/service.log

# 创建新窗口
Ctrl + a c

# 在第三个窗口进行其他操作
vim config.conf

# 断开会话
Ctrl + a d

高级功能

复制粘贴模式

# 进入复制模式
Ctrl + a [

# 使用方向键移动光标
# 空格键开始选择
# 再次空格键结束选择

# 粘贴复制的内容
Ctrl + a ]

日志记录

# 启动时启用日志记录
screen -L -S logged_session

# 在会话中启用日志记录
Ctrl + a :log on
Ctrl + a :log off

# 设置日志文件名
Ctrl + a :logfile /path/to/logfile

监视活动

# 监视窗口活动
Ctrl + a :activity on

# 监视静默
Ctrl + a :silence 30  # 30秒无输出时提醒

# 监视响铃
Ctrl + a :bell_msg "Bell in window %n"

配置文件

~/.screenrc 文件中可以自定义 Screen 配置:

# 设置默认的 Shell
shell -/bin/bash

# 启动时创建多个窗口
screen -t shell 0
screen -t logs 1 tail -f /var/log/syslog
screen -t work 2

# 设置状态栏
hardstatus alwayslastline
hardstatus string '%{= kW}%-w%{= BW}%n %t%{-}%+w %-= %c %Y-%m-%d'

# 设置自动断开空闲时间
idle 300 quitlock

# 启用消息等待
defscrollback 10000

故障排除

无法连接到会话

# 如果会话被附加,强制分离后连接
screen -D -r session_name

# 如果多个会话同名,使用会话ID
screen -r 12345.pid

Screen 进程清理

# 清理死掉的会话
screen -wipe

# 手动杀死会话进程
kill -9 <screen_pid>

总结

Screen 是一个强大的终端管理工具,特别适合:

  • 远程服务器管理
  • 长时间运行的任务
  • 多任务并行处理
  • 网络不稳定环境下的工作

掌握 Screen 的基本操作可以大大提高在命令行环境下的工作效率。