一、背景
在云计算的时代里,绝大多数需要操控的计算机已不在本地,往往需要通过 ssh 到远端的服务器(Linux ...)进行管理,而我们在连接的时候是一个会话(界面),在需要执行一些长时间才能完成的任务时(如:数据备份、程序编译等),经常需要等待该任务结束后才能进行下一步操作,另外,如果在连接操作的过程中,如果发生误操作或网络异常导致会话掉线等情况时,该会话中正在运行的任务也会被终止,这就导致了未完成的任务不得不重新执行,实属坑爹,为此有了以下的解决方案。
二、简介
Screen 是一款基于 GNU 计划开发的用于命令行终端切换的自由软件,它允许用户通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。
Screen 可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
Screen 是一个可以在多个进程之间多路复用一个物理终端的全屏窗口管理器。
Screen 有会话的概念,用户可以在一个 screen 会话中创建多个虚拟窗口,在每个虚拟窗口中就像在操作一个真实的 telnet/SSH 连接窗口那样。
GNU Screen 官网:http://www.gnu.org/software/screen/
三、安装软件
直接在终端下运行screen -v
如何没有报错,说明已经按照,则可忽略此步骤,否则根据系统情况执行以下命令安装:
sudo apt-get install screen # Ubuntu/Debian
sudo yum install screen # CentOS
四、语法及参数
screen 基础语法,如下:
screen [-opts] [cmd [args]]
支持以下参数:
-A # 将所有的视窗都调整为目前终端机的大小。
-d <作业名称> # 将指定的screen作业离线。
-h <行数> # 指定视窗的缓冲区行数。
-m # 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称> # 恢复离线的screen作业。
-R # 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s # 指定建立新视窗时,所要执行的shell。
-S <作业名称> # 指定screen作业的名称。
-v # 显示版本信息。
-x # 恢复之前离线的screen作业。
-ls或--list # 显示目前所有的screen作业。
-wipe # 检查目前所有的screen作业,并删除已经无法使用的screen作业。
五、快捷键
screen 除了提供命令控制模式,还提供了各种的快捷键,而且在很多的情况下快捷键比命令更好用。例如:在某 screen 会话中,当前窗口(bash)正在运行在程序,此时的命令行是无法操作的,这时就可以使用快捷键切换到新的窗口中进行新的任务。
Screen 的快捷键由 Ctrl+a 操作符
组成,命令均以 Ctrl+a
作为前缀,在使用时只需先输入(按下)前缀组合键,然后释放按钮,再输入“操作符”即可!
# 窗口创建和关闭
Ctrl+a c -> 创建一个带有 shell 的新窗口并切换到新窗口
Ctrl+a d -> 暂时离开会话(会话中的任务仍继续运行)
Ctrl+a k -> 关闭当前窗口(窗口内运行中的程序会被终止)
# 窗口的切换
Ctrl+a i -> 显示当前窗口信息
Ctrl+a w -> 显示窗口的序号
Ctrl+a " -> 显示所有窗口,以供选择切换
Ctrl+a n -> 切换到下一窗口
Ctrl+a p -> 切换到上一窗口
Ctrl+a Ctrl+a -> 在最近使用的两个窗口间切换
Ctrl+a num -> num 为 0-9 之间的数字,切换至 num 对应的窗口
Ctrl+a [Space] -> 由窗口0循序切换到窗口9
# 窗口的划分与管理(分屏)
Ctrl+a S -> 水平分割屏幕
Ctrl+a | -> 垂直分割屏幕
Ctrl+a <tab> -> 在分割屏幕中切换
Ctrl+a X -> 关闭光标所在屏幕区块(任务不中断)
Ctrl+a Q -> 关闭光标以外的屏幕区块(任务不中断)
# 会话锁定与解锁
Ctrl+a s -> 锁定当前会话(会话中的任务会被暂停)
Ctrl+a q -> 解锁会话(原暂停的会话会继续运行)
Ctrl+a x -> 锁住当前会话,需用用户密码解锁(会话中的程序继续运行)
# 辅助功能
Ctrl+a H -> 开始/结束对当前窗口输出的记录,记录保存在名为 "screenlog.n" 的文件中
Ctrl+a C -> 清屏
Ctrl+a l -> 刷新当前窗口
Ctrl+a ? -> 显示按键与功能的绑定
Ctrl+a [ -> 进入复制模式(操作其大致与 vim 类似,详见官方文档及下方参考资料)
Ctrl+a ] -> 将复制模式中复制的内容粘贴
Esc -> 结束 copy mode
# vim 下的快捷键
H // 首行的起使位置
L // 末行的起使位置
0 // 移到当前行行首
$ // 移到当前行行末
w // 以字为单位往前移
b // 以字为单位往后移
Space // 第一次按为标记区起点,第二次按为终点
六、使用教程
1、创建screen会话
$ screen -S test1
执行命令后,系统会创建一个名为 test1 的会 Screen 话,并在建立好会话后即时打开一个系统默认 shell (一般是bash),然后返回这个 shell 窗口(虚拟的),所以此时会在屏幕上看到返回的命令提示符界面:
接着按下 Ctrl+a "
快捷键可以查看 mytest 会话下的窗口情况(虚拟的),因为是新建的会话,所以默认只有一个 0 bash
的窗口:
在操作过程中经常会遇到一些任务需要长时间执行,这时命令行就被占用了,为了不等机器,如果是在图形界面下,我们只需打开一个新的窗口就可以开展新的工作了,那么在远程ssh连接管理时,怎样去处理这种情况呢?
此时可以按下 Ctrl+a c
在当前 test1 会话中新建一个窗口,按下快捷键后,窗口会瞬间创建并切换到新的虚拟窗口,屏幕实时切换到新的提示符下,这时就可以开展新的任务了:
这时再使用Ctrl+a "
就可以看到存在0 bash
和1 bash
两个虚拟窗口了。
2、暂离screen会话
当需要暂离当前 screen 会话时,可使用Ctrl+a d
快捷键离开,离开后,原有screen会话中的程序不会关闭,仍在运行,后面可以根据需求随时恢复连接到该会话上,连接的成功与否,关键是原有的程序是在screen会话中运行的。
3 、查看screen会话列表
久而久之,工作中可能会忘掉前面都新建了哪些会话,这时可使用screen -ls
列出当前所有的 screen 会话:
图中一共有2个会话,已连接的状态为(Attached),未连接的为(Detached),其中会话的名称不是唯一的,可同名。
4、 恢复screen会话
从上面查到的信息中可以知道会有 id
和 名称
两个标识,所以这里可以使用 会话ID
或 会话名称
配合 screen -r
命令进行暂离会话的恢复,如:
screen -r 5793
或
screen -r mytest
以上两种方式均可实现会话重连,但不建议使用会话名称,这主要是会话名称的非唯一性。
5、终止screen会话
需要终止某个会话就必须关闭该会话中的所有窗口,所以可以使用 exit
命令依次退出各个虚拟窗口,当最后一个窗口被关闭时,当前会话就会结束并从会话列表中移除。
6、清除dead会话
当一个 Session 会话异常退出时(如:误kill),使用 screen -ls
看到的会话状态是 (Dead ???) ,这时如需清除该消息,可使用 screen -wipe
清除所有已经 Dead 的会话,实现过程如下:
$ screen -ls # 列出会话列表
$ kill -9 Dead_session_id # 模拟会话异常退出
$ screen -ls # 此时 Dead_session_id 的状态为 (Dead ???)
$ screen -wipe # 清除已 Dead 的会话
7、会话共享
会话共享适合用于操作演示等场景,例如网络教学,老师和学员分布在不同的地域,但他们可用通过 screen 实现会话的同步显示,例如:老师和学员均远程到某台主机,然后老师使用 screen -S show
创建一个会话,学员们使用 screen -x show
连接到该会话,这样老师对终端的所有操作都会同步到学员的屏幕上。
注意:此时的会话操作是共享的,即双向均可操作系统资源,可以理解为多屏操作。
8、会话锁定
screen 提供 Ctrl+a s
的快捷键锁定会话,会话被锁定后,所有的输入在锁定的这个过程是无效的且输入的信息不会显示到屏幕上,所说看不到输入的内容,但这些输入仍是有被记录下来的,当解锁后,如果输入的是有效的命令,在解锁后的那一刻将被执行,且在屏幕上显示相关信息。
被锁的会话可以使用 Ctrl+a q
快捷键进行解锁。
除上以外,还可使用 Ctrl+a x
锁定会话,这种加锁方式引用了用户密码保护,若需要操作就必须输入用户密码解锁。
9、屏幕分割
在终端模式下,屏幕分割是个酷炫的骚操作,常在黑客的画面里出现,这里 screen 也提供了屏幕分割(快捷键):
Ctrl+a S -> 水平分割屏幕
Ctrl+a | -> 垂直分割屏幕
Ctrl+a <tab> -> 在分割屏幕中切换
Ctrl+a X -> 关闭光标所在屏幕区块(任务不中断)
Ctrl+a Q -> 关闭光标以外的屏幕区块(任务不中断)
10、 数据交互(复制/粘贴...)
在某些情况下,为了高效工作,我们需要使用一些数据上的交互操作,例如:在同一会话中不同窗口 或 不同会话的不同窗口 上的文字进行复制和粘贴。
这里演示在同一会话下不同窗口的文字复制粘贴 交互。例如:将 窗口0
中 A文件
的某些内容复制到 窗口1
的 B文件
中:
首先进入 窗口0
,使用vim打开 A文件
,此时按下 Ctrl+a [
快捷键,接着秉承vim的一贯操作,将光标移至目标文字起使位置,按 Space
开始记录,接着通过方向键移动光标选中复制区域,选好后再次按下 Space
结束复制。
接着使用 Ctrl+a "
切换到 窗口1
下,同样使用vim打开 B文件
并按 i
进入编辑模式,接着按下 Ctrl+a ]
就可以完成粘贴了。
七、小结
Screen 工具灵活/好用的地方在于其可通过不同的会话和会话上的窗口来灵活管理系统,不同的会话和不同的窗口可以分别执行不同的任务,而且互不影响,且个会话和窗口可以进行随时的切换甚至交互,并且在连接掉线、异常等情况下可以快速恢复连接,避免任务因连接掉线而中断或窗口被占用而在等待机器完成等情况。