简介
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才会离线窗口
列出全部窗口:
恢复离线窗口:
在 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窗口(譬如test1)在前台运行时,从另外一个窗口执行以上命令,能够实现两个screen窗口显示信息彻底一致
两个终端均可以操做该窗口,输入和输出会同时显示在全部终端上
清除没法使用的screen:
杀死某个session:
或者在交互界面Ctrl+a,而后输入k
screen在脚本中的运用
screen的经常使用命令常常伴随着交互,但若是运用到脚本中,就不容许带有交互式的命令了
使用screen启动窗口同时离线运行:
该命令会开启一个test1的screen窗口运行/tmp/1.sh脚本,并将窗口离线
适用于做为一个服务的运行命令
这里 -m 必须加上,不然不容许直接建立一个离线的窗口
使用screen传递输入给离线窗口:
screen -X -S test1 stuff "THIS IS TEST\n"
命令会向窗口test1中输入“THIS IS TEST”字符串,并回车
这里若是不加上 stuff,则表示后面的内容为发给 screen 的命令(与直接在终端执行的命令不一样,是给screen发送的指令)
若是加上 stuff,则表示在指定窗口的终端输入以上字符串,后面加上\n 表示回车
字符串中可使用脚本中的变量,它会自动读取变量的值之后再传入到窗口执行
虽然上面提到的 "screen -X -S test1 quit" 命令也能退出窗口,但该命令直接跟screen发送指令,相似于kill杀死该窗口,窗口中运行的服务不会平缓关闭,存在丢数据的风险
若是本身运行的服务在前台运行,且收到quit或者其余指令后会平缓退出,能够在加上 stuff 后接上命令,这样的退出会可控一点