简介

Screen是一款用于命令行终端切换的自由软件
用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换
GNU Screen可以看作是窗口管理器的命令行界面版本
它提供了统一的管理多个会话的界面和相应的功能

主要优点

screen的优点有很多,但我认为最主要的是可以在网络连接中断后,不会丢失对已经打开命令行的控制
其他优点:
1.可以将需要长时间运行的脚本放到后台运行,虽然nohup和&都有这种功能,但他们不方便再次将其调到前台进行交互操作
2.可以将窗口共享,即多人可以共用一个窗口,任意一个人产生的输入输出,其他人都能看到,共享窗口可以设置密码保护(如何设置密码,我还没查到,希望知道的大神可以回复一下)
3. 被screen管理的终端,不是放到后台运行才可以保证进程不中断,即使在前台运行时,突然断电等其他原因导致终端突然关闭,该终端中运行的进程依旧会正常运行,使用screen命令可以继续调出该终端

常用参数和命令

-A    将所有视窗都调整为目前终端机的大小
-d    后接作业名或id,用于将在其他终端前台运行的窗口离线,也就是放到后台运行
-r    后接作业名或id,用于恢复离线窗口,也就是重新将该窗口调到前台运行。
-R   后接作业名或id,如果存在该离线窗口则调到前台运行,此时类似-r;如果不存在该离线窗口,则创建新窗口,作业名为指定的字符串;如果存在该窗口,但未离线,则创建同名窗口,但id不一样;这里可以看出 id 才是窗口的唯一标识
-S    后接作业名,用于指定窗口的作业名
-v    显示版本
-x    后接作业名或id,如果该screen作业处于离线状态,则恢复该离线窗口,此时类似于-r参数;如果该窗口处于前台运行,则当前终端与原终端共享该窗口,具体介绍见下方例子
-X    给 screen 传递指令。通常与-S配合,给指定的窗口发送指令;与stuff配合,表示在指定窗口内执行传递的命令。具体介绍见下方例子
-ls或--list    显示目前所有的screen作业
--wipe    检查目前所有的screen作业,并删除已经无法使用的screen作业
 
这里说明一下:
上面几乎所有参数,指定作业名时,可以不用指全,只要能够确定唯一的一个窗口,即使只写一个字母也可以
如果多个作业名都包含指定的字符串,且其中有一个作业名正好和指定的字符串完全相同,则会选择该窗口
如果多个作业名都包含指定的字符串,且其中没有一个作业名正好和指定的字符串完全相同,则会提示有多个符合的窗口,需要重新选择,并且列出所有符合的窗口
 
一点建议:
虽然前面介绍的很多参数都可以不用指定完整的作业名,但我还是建议在使用screen时尽量使用id,或者使用完整的作业名
最好保证作业名间不存在包含关系,如尽量不要让作业名为 test_screen 和 test_screen_a 同时存在
因为,可能会出现想杀死 test_screen 窗口,但是正好这个窗口不存在或者已经被杀死了,就会导致误杀 test_screen_a 的情况
 

常用命令

新建screen窗口:
screen                                     # 该命令会创建一个新窗口,名称随机命名,-S 可以用来指定窗口
screen -S test1                            # 该命令创建一个名为test1的新窗口,默认进入bash,也就是我们终端刚打开时的样子
screen -S test2 /bin/bash /tmp/1.sh        # 该命令创建一个名为test2的新窗口,并运行脚本1.sh,如果脚本执行结束或者中断,这整个窗口将被删除

 

在交互界面离线窗口:
Ctrl+a 然后输入d,不用回车即可将screen窗口离线。但是在输入 Ctrl + a 后,界面是没有任何变化的,没有任何提示信息,直到输出d才会离线窗口
在其他终端将scren窗口离线:
screen -d test1

 

列出所有窗口:
screen -ls

 

恢复离线窗口:
screen -r test1

 

在 screen 管理的的窗口中,也可以恢复其他离线窗口:
该命令必须要求当前screen在bash界面,能输入相应命令,而不是运行一个占用前台的进程的screen窗口
该命令执行后,使用 screen -ls 显示的上一层的 screen 窗口仍在前台运行
这时候如果使用 exit 退出 test1 窗口,或者在其他终端使用 screen -d 离线 test1 窗口,就可以回到上一层窗口了,但如果是使用 ctrl + a 再输入 d 的方式离线 test1 窗口,那么该终端会完全退出 screen 管理的窗口,切到系统的终端,但使用 screen -ls 列出的刚才上一层的窗口依然是活跃的,这时候只能使用 screen -d 去离线窗口,然后再使用 screen -r 进入该窗口了
 
共享screen窗口:
screen -x test1

 

当一个screen窗口(譬如test1)在前台运行时,从另一个窗口执行以上命令,可以实现两个screen窗口显示信息完全一致
两个终端都可以操作该窗口,输入和输出会同时显示在所有终端上
 
清除无法使用的screen:
screen --wipe

 

杀死某个session:
screen -X -S test1 quit

 

或者在交互界面Ctrl+a,然后输入k

screen在脚本中的运用

screen的常用命令经常伴随着交互,但如果运用到脚本中,就不允许带有交互式的命令了
 
使用screen启动窗口同时离线运行:
screen -d -m -S test1 /bin/bash /tmp/1.sh

 

该命令会开启一个test1的screen窗口运行/tmp/1.sh脚本,并将窗口离线
适用于作为一个服务的运行命令
这里 -m 必须加上,否则不允许直接创建一个离线的窗口
 
使用screen传递输入给离线窗口:
screen -X -S test1 stuff "THIS IS TESTn"

 

命令会向窗口test1中输入“THIS IS TEST”字符串,并回车
 
这里如果不加上 stuff,则表示后面的内容为发给 screen 的命令(与直接在终端执行的命令不同,是给screen发送的指令)
如果加上 stuff,则表示在指定窗口的终端输入以上字符串,后面加上n 表示回车
字符串中可以使用脚本中的变量,它会自动读取变量的值以后再传入到窗口执行
 
虽然上面提到的 "screen -X -S test1 quit" 命令也能退出窗口,但该命令直接跟screen发送指令,类似于kill杀死该窗口,窗口中运行的服务不会平缓关闭,存在丢数据的风险
 
如果自己运行的服务在前台运行,且收到quit或者其他指令后会平缓退出,可以在加上 stuff 后接上命令,这样的退出会可控一点
内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!