0%

Screen 使用指南

Linux 程序员通常需要打开多个终端窗口连接到远端服务器,虽然现在的终端程序都比较好用,可以让你在多窗口间自如地切换。但是一旦你的网络断了,所有窗口上的远程连接也就断了,下一秒你不得不重新在各个窗口上进行重连。

通过 Screen,你可以在服务器上建立一个多窗口的会话,即使本地 PC 断网,重连服务器之后,直接恢复该 Screen 会话即可。本篇文章介绍 Screen 的基本用法。

Screen 简介

Screen 是一个全屏窗口管理器,可以在多个进程(通常是多个交互式shell)之间复用同一个物理终端。每一个虚拟终端都提供类似于物理终端的功能。当执行 screen 命令时,它会创建一个窗口,并在该窗口中创建一个 shell。之后可以继续执行以下操作:

  • 创建新的窗口并在新窗口中运行 shell
  • 关闭窗口
  • 查看活跃窗口列表
  • 在窗口之间进行切换
  • 在窗口之间复制文本
  • ….

所有窗口之间运行的程序完全相互独立,窗口间的切换并不影响窗口中程序的执行,甚至即使整个 screen 会话被 detach,窗口中的程序仍然会保持运行。当窗口中的程序执行完毕时,screen 默认会终止该程序所在的窗口。如果所有的窗口都被终止了,screen 会话则终止。

配置 Screen

有三种方式可以对 Screen 进行配置:

  • 修改 .screenrc:Screen 启动时会读取 home 目录下的 .screenrc 文件,对 screen 进行配置。该配置文件的中命令可以用于设置 screen 选项、绑定快捷键、或者在 screen 会话启动后自动建立多个 window 等等。Linux 发行版自带一个示例配置: /etc/screenrc
  • source file:从 file 中读取并执行 Screen 命令
  • colon 模式:通过 C-a : 进入 collon 模式,之后就可以直接执行 Screen 命令

Screen 会话

启动 screen 会话

  • 直接执行 screen 命令,将会创建 screen 会话
  • -U:以 UTF-8 模式运行 screen
  • 使用 -S sessionname 启动选项设置新会话的名称。默认会话名称的格式为 pid.tty.host
1
2
3
4
5
$ screen -S test

$ screen -ls
There is a screen on:
25966.test (Detached)

查看 screen 会话

  • 使用 screen -ls 查看 screen 会话列表
1
2
3
4
5
$ screen -ls
There are screens on:
26540.test2 (Attached)
25966.test (Detached)
2 Sockets in /var/folders/28/h5qjbptn0fq83y2k55vgvzv8920py5/T/.screen.

detach 会话

  • 在 screen 会话内,可以通过 C-a d 或者 detach 命令(后者需要进入 colon 模式)
  • 在任何地方,都可以通过 screen -d [pid.sessionname] 的方式 detach 指定会话

**C-a 代表 Ctrl-a**,它是 Screen 默认的控制键。

attach 会话

  • screen -r [pid.sessionname]:attach 到指定会话
  • screen -d r [pid.sessionname]:attach 到指定会话,必要时先 detach。适用的场景:会话已经被 attach,但是找不到 attach 会话所在的终端,通过该命令可以先 detach,再重新 attach

Screen 常用命令

命令 功能 默认快捷键
colon 进入 colon 模式 C-a :
help 帮助 C-a ?
bind [-c class] key [command [args]] 给命令设置快捷键
bindkey [opts] [string [cmd args]] 绑定按键序列到一个字符串
sessionname [name] 重新设置当前会话的名称
detach detach Screen 会话 C-a d
quit 关闭所有窗口,退出当前 session
windowlist -b 列出窗口列表以供选择 C-a “
select 在窗口间进行选择 C-a’
select 0. . . select 9, select - 选择窗口 0…9 以及 blank window C-a 0…9, -
prev 回到上一个窗口 C-a p
next 回到到下一个窗口 C-a n
other 回到之前所在窗口 C-a C-a
info 显示当前窗口的信息 C-a i
number 显示当前窗口的 number C-a N
windows 显示当前活跃的窗口 C-a w
screen 创建一个新的窗口并切换到该窗口 C-a c
kill 关闭当前窗口 C-a k
collapse 重新排列窗口,消除窗口编号 gap
shell command 设置创建 shell 的命令
title 修改当前窗口的 title C-a A
chdir [directory] 为之后的窗口设置工作目录
meta 在窗口中发送 C-a C-a a
clear 清屏 C-a C
log 开启当前窗口的 log,并保存到 screenlog.n C-a d
split 将当前 region 水平划分成两个 region C-a Q
split -v 将当前 region 垂直划分成两个 region C-a
focus [ next prev up
remove 移除当前 region C-a X
only 只留下当前 region C-a Q
fit 根据当前 region 调整窗口大小 C-a F
copy 进入 copy/scrollback 模式 C-a [
paste 进入 paste C-a ]
history copy 之前的命令 C-a {

Tips

  • 在 detach 会话后,会话中的 region 布局并不会自动保存。可以通过创建 layout 来保存布局。但是在我的环境中并没有使用成功?

  • screen 允许我们直接 copy/paste 窗口中的内容。在进入 copy/scrollback 模式后,可以通过类似于 vim 的命令进行光标移动。复制范围通过两个 mark 进行设置,两个 mark 之间的本文被复制。通过 spaceenter 设置 mark。之后直接就可以通过粘贴命令粘贴选中文本

  • 在 iterm2 上使用时碰到一个问题,鼠标滚动并没有滚动屏幕,而是滚动了 bash 命令行历史,此时可以尝试将 iterm2 的 Disable save/restore alternate screen 勾选上,问题得到解决

.screenrc

这里访问我的 .screenrc

Reference