您的位置:首页 > 运维架构 > Linux

通过screen解决终端模拟器断开连接之后丢失会话的问题

2017-02-24 21:33 411 查看
当使用Xshell、putty、SecureCRT等终端模拟器远程连接至Linux服务器时,如果需要执行一个耗时很长的命令或脚本,在尚未执行完毕之前,客户端突然断开网络连接,或者终端模拟器发生死锁,此时客户端便会失去先前和Linux服务器建立的会话。由于不能实时查看脚本或命令的执行日志,因此也就很难判断它们的执行状态,应该如何解决这个问题呢?

使用screen工具可以解决这个问题!screen是Linux系统的一种多重窗口管理器。当终端模拟器通过telnet或ssh远程登录至Linux服务器时,如果网络连接非正常中断,那么客户端可以通过screen工具重新连接至Linux服务器,恢复先前的网络会话。screen具有以下三个主要功能:

会话恢复

只要screen自身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用 —— 即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行
screen -r
命令就可以恢复先前会话的运行。同样在暂时离开的时候,也可以执行分离命令
detach
,在保证里面的程序正常运行的情况下让screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。

多重窗口

在screen环境下,所有的会话都会独立运行,并且拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口之间切换,并且可以自由地重定向各个窗口的输入和输出。screen实现了基本的文本操作,如复制和粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。

会话共享

screen可以让一个或多个用户从不同终端多次登录同一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。

一、环境描述

操作系统:CentOS 6.6 x86_64 Minimal

YUM源:CentOS官方镜像源

screen版本:4.00.03

终端模拟器:Xshell 5 (Build 1019)

二、用法和参数

1. 使用方法

screen具有两种使用方式:

1.1 新建会话

screen [-opts] [cmd [args]]


其中,opts是可选参数,cmd是可选的待执行命令,args是待执行命令的参数。

1.2 恢复会话

screen -r [host.tty]


其中,host.tty是先前建立的会话名称。

2. 可选参数

screen具有以下的可选参数:

-4:使用IPv4协议。

-6:使用IPv6协议。

-a:将所有的功能强制包含在每个窗口的termcap之中。

-A -[r|R]:将所有的窗口适配于新的显示宽度和高度。

-c file:读取/etc/screenrc配置文件,而不是$HOME/.screenrc文件。

-d (-r):分离在别处运行的screen会话,然后在此处重新连接。

-dmS name:以守护程序的方式启动screen工具,screen会话处于分离模式。

-D (-r):分离和登出远程的screen会话,然后在此处重新连接。

-D -RR:执行能够获取screen会话的所有必需的操作。

-e xy:修改命令字符。

-f:开启流控功能。

-fn:关闭流控功能。

-fa:系统自动决定是否使用流控功能。

-h lines:设置回滚历史缓冲区的大小,lines参数指定行数。

-i:当开启流控时,立即中断输出。

-l:开启登录模式(更新/var/run/utmp文件)。

-ln:关闭登录模式。

-list或-ls:什么都不做,仅仅列出SockDir的内容。

-L:开启输出日志。

-m:忽略$STY变量,强制创建一个新的screen会话。

-O:选择最优化的输出方式,而不是精确地模拟vt100终端。

-p window:预选具有名称的窗口(window参数指定),如果存在的话。

-q:静默启动。如果不成功,则返回非零值。

-r:重新连接至一个已分离的screen会话。

-R:重新连接至指定的screen会话,若不存在,则建立新会话。

-s shell:指定建立新窗口时,需要执行的shell。

-S sockname:将screen会话的名称指定为<pid>.sockname,而不是<pid>.<tty>.<host>。

-t title:设置窗口的标题名称。

-T term:使用term作为窗口的$TERM变量,而不是使用“screen”。

-U:指定screen工具使用UTF-8编码。

-v:输出screen工具的版本号。

-wipe:什么都不做,仅仅清除SockDir目录。

-x:连接至一个未分离的screen会话(多重显示模式)。

-X: 当执行screen命令时,在指定的会话中同时执行<cmd>指定的命令。

3. 快捷键

在每个screen会话中,所有的命令都以
ctrl+a
C-a
) 开始:

C-a ?

显示所有的快捷键信息。

C-a c

创建一个新的运行shell的窗口,并切换到该窗口。

C-a n

切换到下一个窗口。

C-a p

切换到前一个窗口。

C-a 0..9

切换到第0..9个窗口。

C-a [Space]

由窗口0循序切换到窗口9。

C-a x

锁定当前的窗口,需要用户密码解锁。

C-a d

暂时离开当前的会话,将当前的screen会话(可能含有多个窗口) 切换至后台执行,并且回到尚未进入screen会话时的状态。此时,在screen会话里,每个窗口内运行的进程(无论是前台/后台)都在继续执行,即使登出系统也不会受影响。

C-a z

把当前的screen会话切换至后台执行,用shell的
fg
命令则可以切换回去。

C-a w

显示所有窗口列表。

C-a t

显示当前的时间和系统的负载状态。

C-a k

强行关闭当前的窗口。

screen会话还有一种特殊的工作模式,叫做拷贝模式(copy mode)。在 拷贝模式中,可以进行回滚、搜索、复制等操作,就像用使用vi一样:

C-a [

进入拷贝模式。

C-b Backward

在拷贝模式中,向上翻页。

C-f Forward

在拷贝模式中,向下翻页。

H

在拷贝模式中,将光标移至左上角。

L

在拷贝模式中,将光标移至左下角。

0

在拷贝模式中,将光标移至行首。

$

在拷贝模式中,将光标移至行末。

w

在拷贝模式中,光标以字为单位往前移。

b

在拷贝模式中,光标以字为单位往后移。

Space

在拷贝模式中,第一次按设置标记区起点,第二次按设置标记区终点。

Esc

在拷贝模式中,退出拷贝模式。

C-a ]

粘贴先前在拷贝模式选择的内容。

三、使用示例

1. 安装screen

CentOS的官方镜像源自带screen工具,可以通过以下命令安装:

yum install -y screen


安装完成之后,检查screen版本,如下图所示:





2. 创建新窗口

运行以下命令就可以进入一个指定名称的screen会话:

screen -S <session_name>


其中,session_name就是指定的会话名称。进入screen会话时,会创建第一个窗口,也就是“screen 0”,并且打开系统默认的Shell,一般是Bash。因此,在执行上述命令之后,会立刻又返回至命令提示符,就好像什么都没有发生,但实际上已经进入screen会话了。

另外,在执行screen命令时,还可以直接打开指定的程序:

screen <cmd [args]>


其中,cmd是指定的待执行程序名,args是待执行程序的参数。screen会创建一个执行指定程序的单窗口会话,退出这个程序就会退出相应的窗口/会话。

3. 会话的分离与恢复

当在screen会话的窗口中执行耗时较长的程序时,可以不中断正在运行的程序而暂时离开(detach)screen会话,稍后还可以重新连接(attach)该会话,重新控制会话窗口中运行的程序。

例如,打开一个screen窗口,更新整个系统的组件:

screen yum update -y


这个命令的执行时间较长,此时如果需要处理别的事情,那么就需要暂时退出这个screen窗口,只需要按下快捷键“C-a d”,screen就会给出会话分离的提示,如下图所示:





在事情处理完毕之后,找到这个screen会话:

screen -ls


上述命令会列出所有的screen会话,如下图所示:





此时,便可以重新连接screen会话:

screen -r 2122


先前在screen窗口中执行命令的状态依然可见,如下图所示:





4. 清除dead会话

如果由于某种原因,某个会话死掉了(例如:手动杀掉该会话的进程),这时
screen -ls
命令便会显示该会话为dead状态。可以使用
screen -wipe
命令清除dead会话:





5. 关闭窗口

在screen窗口中输入
exit
命令便会退出当前的screen窗口,当screen会话中的所有窗口都退出时,便会退出这个screen会话。也可以使用
C-a k
快捷键退出当前的screen窗口。

如果某个程序随同screen命令同时执行,那么在这个程序运行结束时,也会自动退出相应的screen会话。

6. 会话共享

当在一个终端模拟器中进入screen会话时,在另一个终端模拟器中也可以连接至这个screen会话,运行以下命令:

screen -x [session_name]


其中,session_name就是想要连接的screen会话的名称。这个命令的效果相当于让两个人坐在同一个显示器前面,一个人的操作会同步演示给另一个人,反之亦然。

7. 会话锁定和解锁

screen允许使用快捷键
C-a s
锁定会话。会话锁定之后,再进行任何输入屏幕都不会再有反应了。但是要注意虽然屏幕上看不到反应,但是输入都会被screen中的进程接收到。快捷键
C-a q
可以解锁一个会话。

另外,还可以使用
C-a x
锁定会话。不同的是,这样锁定之后,会话会被screen所属用户的密码保护,需要输入密码才能继续访问这个会话。

8. 发送命令到screen会话

在终端模拟器中,可以通过screen命令在一个已存在的screen会话中执行指定的命令,例如:

screen -S test -X screen ping www.baidu.com


这个命令会在一个名为test的screen会话中创建一个新窗口,并在其中运行ping命令。

9. 屏幕分割

有时候需要在同一个终端模拟器窗口中,一边执行程序,一边监控系统系统性能,这时可以将屏幕分割成不同的区域,分别显示不同的screen窗口。

例如,首先创建和进入一个名为test-screen的会话:

screen -S test-screen


然后,运行
top
命令,再使用快捷键
C-a S
,将屏幕水平分割,如下图所示:





由上图可知,屏幕已经分为上下两个部分,上半部分运行
top
命令,下半部分是空白的。此时,使用
C-a TAB
快捷键,将光标切换至下半部分,再使用
C-a c
快捷键,在下半部分新建一个screen窗口,运行Bash Shell。最后,在下半部分的screen窗口中运行
fdisk -l
命令,如下图所示:





可以使用
C-a X
快捷键关闭光标当前所在的屏幕区块,也可以使用
C-a Q
快捷键关闭除当前区块之外的其他所有区块。关闭的区块中的screen窗口并不会关闭,还可以通过窗口切换找到它。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  centos linux screen
相关文章推荐