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 | $ screen -S test |
查看 screen 会话
- 使用
screen -ls查看 screen 会话列表
1 | $ screen -ls |
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 之间的本文被复制。通过
space或enter设置 mark。之后直接就可以通过粘贴命令粘贴选中文本 -
在 iterm2 上使用时碰到一个问题,鼠标滚动并没有滚动屏幕,而是滚动了 bash 命令行历史,此时可以尝试将 iterm2 的
Disable save/restore alternate screen勾选上,问题得到解决
.screenrc
在这里访问我的 .screenrc。