一、应用场景

作为系统运维工程师我们经常要通过SSH远程连接Linux服务器,对系统进行维护。如果你正在运行一个大型的需要长时间运行的任务,诸如对数据库备份,对应用系统进行升级等,很不凑巧这一天这一刻你接到了女友速回的强制命令。这时你就遇到了两难问题:要么马上关闭窗口,断开连接,速去向女友报到,可是这样的结果,当前正在运行任务就会over,很可能就会得到老大的另一番训斥;要么你就强忍着把这样一个任务运行完再去见你那位女皇,结果大家可想而知。

还是现身说法大家理解更为真实!

现在准备了一台远程服务器,IP地址为172.16.1.90,在远端通过SSH连接上去,运行一个任务(或程序),如vi /etc/passwd

Linux必会工具之远程会话管理工具——screen

在远端服务器上使用w、pstree等工具查看,可以看到正在运行的进程

Linux必会工具之远程会话管理工具——screen

假设我现在把ssh会话窗口关闭来模拟者由于网络连接原因造成ssh会话突然中断的现象

Linux必会工具之远程会话管理工具——screen

在回到远端服务器上使用w、pstree等工具查看,可以看到刚才打开的进程已经被终止(SIGHUP)了,你心里一定在想“可恶”!,其中原因主要是当用户注销(logout)或网络中断时,终端会收到HUP(hangup)信号,从而关闭其所有子进程。

Linux必会工具之远程会话管理工具——screen

难道没有一个两全其美的方法了吗?怎样才能避免这样的境遇不会再出现,即当我们断开连接关闭终端窗口时,我们当前正在运行的任务(进程)不再受到影响!

这时screen跳出来了说,何不试试我的威力呢?screen何许人也?【注:还可以让让进程忽略 HUP 信号,如使用nohup工具】

官方的解释是这样的:

The screen utility allows you to have multiple logins on just one terminal. Screen is useful for users who telnet into a machine or are connected via a dumb terminal, but want to use more than just one login.

我的理解是:screen这工个工具可以让你在一个终端上拥有多个登录,运行多个终端应用,可以很好解决使用ssh远程连接Linux时,由于连接中断造成会话不能恢复的问题。

【来自IBM官网】Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。

二、安装

yum -y install screen

    三、初步使用

让我们再试着模拟刚才的场景,不过我们这次可是使用的“screen”这把利器。

Linux必会工具之远程会话管理工具——screen

在远端服务器上使用w、pstree等工具查看,比较一下和刚才看到的结果有什么不一样

Linux必会工具之远程会话管理工具——screen

现在再把ssh会话窗口关闭,看看这次和上次关闭有什么不同,好像并没有什么不同,其实大不然,让我们在远端服务器上使用w、pstree等工具查看,发现虽然远程会话关闭了,但开启的进程并不有结束

Linux必会工具之远程会话管理工具——screen

可是问题又来了,怎么恢复刚才的会话呢?让我们重新使用ssh连接上远程服务器后,使用screen –ls 命令列出当前有哪些screen会话在运行

Linux必会工具之远程会话管理工具——screen

是不是看到一个会话,其会话ID为3527,这就好办了,使用screen –r 3527 重新建立起刚才中断的会话

Linux必会工具之远程会话管理工具——screen

是不是刚才的会话又“重现”了,是不是很神奇!想一想这对于我们的开发人员、运维工程师来讲绝对是一大福音。

四、进阶使用

(1)[[email protected] ~]# screen -S editsample          #启动一个名称为editsample的会话

备注:可以开启多个screen会话

[[email protected] ~]# screen -ls
There is a screen on:
        3917.edit       (Attached)
1 Socket in /var/run/screen/S-root.

然后你就可以在刚才打开的会话中执行你要的任务了,这样即使连接被中断,也不会造成任务中断,多么好啊!

(2)把一个正在运行的会话“抢”过来

[[email protected] ~]# screen -d –r   #screen –d -x也可以达到类似的效果

我现在使用screen开启了一个editsample的会话,并运行了vi /etc/passwd这个进程

Linux必会工具之远程会话管理工具——screen

接下来我在另一个ssh终端窗口操作

Linux必会工具之远程会话管理工具——screen

当我执行screen –d  -r命令后,发现会话已经到我这边了,这个命令对于作为运维工程师到处“流窜”的我们特别有用

Linux必会工具之远程会话管理工具——screen

Linux必会工具之远程会话管理工具——screen

(3)会话的扩展

【ctrl+A C】在一个screen会话中创建一个新的窗口,相当于创建一个新的shell

提示:先按ctrl+A组合键,再按C键

Linux必会工具之远程会话管理工具——screen

【ctrl+A 】在窗口间进行切换

【ctrl+A N】切换到下一个窗口

【ctrl+A P】切换到上一个窗口

【ctrl+A  0…9】切换到指定编号的窗口

【ctrl+A W】显示所有窗口列表

Linux必会工具之远程会话管理工具——screen 

可以看到当前screen会话有3个会话窗口,编号分别为0、1、2,当前活动窗口的编号为2

【ctrl+A D】退出screen会话,可以通过screen -r恢复会话

五、与 nohup比较

nohup可以临时救急,但是当我们要运行多个后台这样的命令并且不因网络连接断开而中断时,screen无疑是更好的解决方法

六、总结

screen在实际应用中确实较为常用,是运维管理人员必学工具之一!