大家都知道Linux的SSH连接并不像Windows可以执行多任务,至少在没有使用到类似今天的主角screen时是这样。一般情况下我们通过SSH连接我们的Linux服务器时,只能执行一个命令或者程序,然后如果这个程序一直执行的话,就会一直显示这个程序的运行状态。假如我们想像桌面一样,可以运行A程序,然后最小化,然后接着运行B程序,C程序,D程序……那该怎么实现呢?
今天我们就来讲解一下screen命令的使用,screen命令是linux下的一种多重视窗管理程序。那么哪些情况下需要使用它呢?
1、通过SSH正常执行一个程序,然后中途断网或者SSH断开了,那么程序就中止了,但是假如我们想在断网后程序也继续运行呢?
2、通过SSH运行一个程序,然后我们想把这个程序放到后台继续执行,然后前台界面执行其它程序时
3、通过SSH运行一个程序,然后需要断开SSH,但是程序不停止运行,这一点有点类似第一点
以上几种情况就是最常见的需要使用screen的情况,而这几种情况无非都是针对一个目的:那就是让程序在后台执行!
首先我们先来安装screen,在Centos下,执行yum install screen -y
安装完成后,我们先来看看常用的参数有哪些?一般情况下,我常用的参数就三个:-URd
下面用到的时候我会分别讲解这三个参数的作用
我们先来看看screen如何使用,正常情况下,我们直接输入screen命令即可。输入完后,貌似没有任何反应?
试试按下键盘的Ctrl + a,然后松开,再按下?键,看看是不是显示了如下界面?
如果是,则说明我们已经成功的进入到了screen模式。按下键盘的空格键或者回车键退出这个说明界面。
上面这个界面就是screen的快捷键说明。所有的快捷键都是基于Ctrl + a的,即所有操作都要先按下Ctrl + a,然后再松开。比如显示上面的这个界面,快捷键就是Ctrl + a,松开,然后再按下问号?键。
好了,那么现在我们进入到screen模式了,我们能干啥呢?我们可以跟平时一样执行命令了。例如我这里有一个php脚本,每2秒输出一次当前时间,我现在执行它:php index.php,然后可以看到效果如下:
然后现在我发现我有其它时间要做,但是我不想停掉这个脚本的运行,那么我现在按下Ctrl + a,然后松开,再按下d键,跳出screen模式,可以看到提示:
这个提示是告诉我们,我们从screen模式退出来了,然后有一台任务在后台运行中,进程的id是2177。
我们可以使用screen -ls命令查看当前有哪些任务在后台运行中,例如:
从上图可以看出,我们有一个任务在后台运行中,进程id是2177,这个正是我们刚刚运行php脚本那个任务。现在我们输入screen -r 2177,恢复到刚刚那个任务界面,可以看到:
我的脚本还在不停的运行中,并没有停止。
我先来解释一下screen -r 2177这个命令,这个命令是指恢复到指定的任务,而这个任务的id是2177。假如我们想停止这个脚本的运行,那么只要像平时普通SSH模式下一样按下Ctrl + c即可。
当我们想完全退出这个screen任务的时候,先按下Ctrl + c将当前运行的命令或者程序停止,然后再按下Ctrl + d即可终止任务。终止后可以看到如下提示,并且使用screen -ls也查看不到刚刚的任务。
那么至此为止,我们应该知道了screen的用法对吧?回到文章一开头介绍的几个参数-URd,那么这几个参数有什么用呢?
参数U:指定screen任务使用UTF-8编码
参数R:恢复到指定的screen任务,假如这个任务存在的话,如果不存在则新建一个screen任务(相当于直接执行screen命令)
参数d:假如有其他人在screen任务界面,则将这个人踢出来,相当于强行给那个人按下Ctrl + a,松开,然后按下d的操作。这种情况一般出现在什么时候呢?就是当一个人连接SSH,然后进入到screen模式下,然后另一个也连接了这个SSH,并且通过-r参数恢复到同一个screen任务的时候,就可以使用-d参数,将先进入screen任务的那个人踢走。
一般情况下我是这么用的:
screen -URd 任务名称
例如:screen -URd php
那么这样我就创建了一个名字叫php的任务,以后我要恢复到这个任务的时候就不需要查询这个任务的进程id,我可以直接再执行一次screen -URd php就恢复到这个任务的界面了。
下面看一下演示,同样是执行先前那个显示时间的php脚本。我们先执行screen -ls查看有没有在执行的任务先
很好,没有任务在运行。下面我们执行screen -URd php,当我们第一次执行的时候,因为名字叫php的这个任务并不存在,所以会新建一个screen任务,名字为php,当第二次执行这个命令的时候,因为我们已经创建了一个叫php的任务,所以会直接进入到这个任务的界面。
当我们进入名字叫php的任务后,执行php脚本,然后按下Ctrl + a,松开,按下d,隐藏任务界面。然后可以看到提示信息:detached from 2216.php
2216就是进程id,php就是我们取的名字。
通过screen -ls也可以看到当前运行中的任务情况。然后我们再次执行screen -URd php,是不是又恢复到我们的任务界面了?同样的,我们也可以试试screen -r 2216或者screen -r php,这两种方法都可以恢复到我们的任务界面。
是不是感觉很神奇呢?有了screen命令后,我们也可以通过SSH来执行多任务了。大家学会怎么用了吗?
最后再次提醒大家:如何判断当前是在普通SSH命令模式还是在screen模式下呢?我们只要按下Ctrl + a,松开,再按下问号?键,如果显示screen的快捷键说明界面,则说明我们当前是在screen模式下,反之则说明我们在普通SSH命令模式下。
ok
mjj通道