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 的基本操作可以大大提高在命令行环境下的工作效率。