终端命令神器--Screen命令详解。助力Unix/Linux使用和管理
本文最后更新于 2023年9月17日 上午
作者:Mintimate
Mintimate’s Blog,只为与你分享
GNU计划
早在Unix发布,其高效率的交互迅速获得大家青睐;但是,随后Unix宣布闭源,以及商业收费后,自然会有一个新的系统来替代。于是,就有了GNU计划(英语:GNU Project),又译为革奴计划。
GUN是一个自由软件集体协作计划,始创于1983年,它的目标是创建一套完全自由的操作系统,称为GNU。也就是我们俗称的Linux系统,后续的Debian、CentOS也是基于Linux开发的发行版本。而我们今天的主角:screen,就是在首批GNU计划内。
GNU Screen
GNU Screen简称Screen或screen,源自GNU计划,其官网:GNU Screen。
初始版本早在1987年就发布,目前的最新稳定版本是:4.8.0(2020年2月5日)。所以,你现在使用的screen命令,其实三十年前就有人在使用了。
上篇文章:Linux上后台保持Terminal交互运行的两种方式,就有提screen,这次来填坑~~╮( ̄▽ ̄””)╭
screen的功能
使用screen,可以极其方便地保留会话,避免因为Terminal SSH连接时间超时,而引发更改;又或者能轻易地后台运行前台交互程序(如:Minecraft服务器、make编译)
screen的功能大体有三个:
- 会话恢复:只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。
- 多窗口:在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。
- 会话共享:Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。
这三个功能,其实互相交织,组成screen功能繁多的命令集。
安装screen
因为screen是“元老级”的GNU计划项目,所以不管是apt软件源、或者是yum软件源等其他软件源,都存在screen,只需要使用软件源安装命令即可:
1 |
|
比如:腾讯云轻量应用服务器的Debian镜像,是纯净的Debian镜像,并没有自带screen的,输入screen,会提示screen: command not found
,但是我们可以使用apt
命令进行安装:
之后,即可使用screen命令:
screen命令集
screen,通常的命令格式为:
1 |
|
通常情况下,使用一下基础命令
即可,高阶命令
过多,比较难记。
注意:
- 命令区分大小写
下文介绍针对screen命令集,对应的:
状态介绍
通常情况下,screen创建的虚拟终端,有两个工作模式:
- Attached:表示当前screen正在作为主终端使用,为活跃状态;通常是用户在使用那个screen虚拟终端,哪个虚拟终端就为
Attached
状态;但是,如果你每次创建虚拟终端后,没有挂起(Ctrl+a再按d),那么终端可能还是为Attached
状态,而不是Detached
状态。 - Detached:表示当前screen正在后台使用,为非激发状态;通常为我们挂起、后台运行的虚拟终端状态。
通常情况下,在正常使用的情况下,不需要关注上面的状态。
除非你喜欢使用相同的虚拟终端昵称,并且经常忘记在退出交互前,挂起虚拟终端为Detached
状态;那么这个时候就需要查看状态,并决定是否需要强制变Detached
状态为Attached
状态了
基础命令
这里列举一些我认为常用的screen命令,使用以下命令基本满足日常使用。
1. 帮助查询
screen的帮助文档实在是过于详细,以至于查个命令,可能要查几分钟;但是你可以直接使用帮助命令,查询自己需要的命令:
1 |
|
通过这个命令,可以查询到大部常用命令。
2. 终端列表
怎么查看已经存在的screen终端呢?很简单,使用命令:
1 |
|
即可查看已经创建(在后台运行的终端):
如果你之前没有创建,那么是为空的,比如我的另外一台腾讯云服务器(主要用于测试,所以没怎么部署东西):
3. 新建终端
大部分人使用screen,是为了让进程以前端运行的方式,后端存活(运行)。所以,使用screen新建一个虚拟终端,后端运行很重要。screen创建虚拟终端的方法很多
比如:直接输入screen回车,即可新建一个虚拟终端,但是这样的名称太乱(以Linux的hostname命名):
screen官方推荐的创建虚拟终端的方法是:
1 |
|
腾讯云轻量应用服务器上演示:
之后,会新建一个空白的Terminal,这个就是新的虚拟终端了,如果你使用的是Oh-my-zsh,其上部还会有提示:
而我一般是使用-R
创建虚拟终端:
1 |
|
创建好虚拟终端后,运行你的程序(如:Springboot):
这个时候,我们按Ctril+a
,再按d
,即可保持这个screen到后台并回到主终端:
三种创建方法比较:
- 使用
-R
创建,如果之前有创建唯一一个同名的screen,且这个screen虚拟终端已经被挂起为Detached
状态,那么,则直接进入之前创建的screen,并设置为Attached
活跃状态。 - 使用
-S
创建和直接输入screen
创建的虚拟终端,不会检录之前创建的screen(也就是会创建同名的screen) - 如果使用
-R
创建虚拟终端前,已经有一个同名的screen虚拟终端,且处于Attached
状态,那么-R
和-S
的效果一样。
4. 回到终端
刚刚我们介绍了创建虚拟终端,并回到主终端的方法。那么,如何重新回到虚拟终端呢?
很简单,使用-R
或者-r
命令即可:
1 |
|
其中:
- pid/name:为虚拟终端PID或Name
如图:
其中:32307为PID,tool为Name。
回到这个虚拟终端的命令即为:
1 |
|
另外-R
和-r
一样,没有对应名称的PID或者Name时,会自动创建新的虚拟终端;
但是,不一样的地方在于,用户使用-r
时,如果同名虚拟终端之前已经创建且处于Attached
状态,那么-r
并不会创建一个同名的虚拟终端,也不会进入其中。
5. 清除终端
有时候,我们的进程已经“守护”完毕,不需要这个虚拟终端了,也就是需要释放资源,如何操作呢?
比较推荐的方法,是进入对应虚拟终端,然后输入:
1 |
|
之后,就会回到主终端。
当然,你如果对screen运行程序,确定已经停止运行了,也可以在主终端内,使用组合命令释放:
1 |
|
高阶命令
screen也有一些高级命令。
绑定键
在虚拟终端内,输入Ctril+a
将等待接受预先设置的绑定键,这个时候可以输入对应的一些命令,来操作虚拟终端,如:
- d:保存会话,后台运行该虚拟终端
- k:关闭对话,等同输入:
exit
- c:新建一个虚拟终端
- ?:显示所有绑定键盘
实际使用
以下操作,均在真实腾讯云轻量服务器上使用过。
场景1:Minecraft后台运行
当我们创建Minecraft,用screen后台运行是个不错的选择。这样,也可以方便后续我们对服务器进行操作(如:设置管理员)
场景2:后台运行Aria2
我们运行Aria2的交互模式,为什么一定要创建为系统Service呢?其实也可以创建为screnn:
场景3:运行FFmpeg交互
有时候,我们需要对爬虫“爬”下来的文件,使用FFmpeg去处理(如:视频转码),这个时候我们可以使用screen后台挂起:
场景4:运行Python爬虫
这个就不放图了,大概就是后台去“爬”一些视频网站,然后screen挂起,方便看日志。
问题&解答
无法进入Attached状态虚拟终端
上文提到,screen有两种状态,Attached
状态,其实代表此虚拟终端,用户正在使用,这个时候,是无法进入的。但是,有时候,我们创建虚拟终端,并没有使用Ctril+a
再按d
退出并挂起虚拟终端,反而因为长时间没操作,或者本地网络掉包等问题,非正常退出虚拟终端,导致出现SSH连接服务器,并没有在虚拟终端内,却出现Attached
状态:
使用screen -r tool
无法进入:
而使用screen -R tool
更会“奇迹般”创建新的虚拟终端。
这个时候,不用慌。
只需要:
1 |
|
其中,
tool
为你无法进入的虚拟终端名称,不要再有网友起了个其他名称虚拟终端无法进入,然后和我说:为什么我用了screen -d tool
后,我的screen还是Attached
状态了。好好想想为什么,不要只会看不会思考,浪费别人和自己的时间。
之后,即可使用screen -r tool
或screen -R tool
进入。
screen内中文输出乱码
中文输出乱码,主要还是编码问题。一般旧版本screen会有这个问题,两个解决方法:
方法一:修改配置文件
创建文件,并加入设置:
1 |
|
加入以下设置:
1 |
|
再次开启虚拟终端,就可以看到中文不乱码了。
方法二:单次设置编码
在创建和查看虚拟终端时,加上-U
参数:
1 |
|
总结
综上所述,就是Linux终端神器- Screen的使用教程和详解。大家是不是都会用这个神器了呢?或者有什么更好的GNU工具呢?欢迎评论区留言嗷。
PS:大家还想了解什么Linux工具呢?