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
。