screen是什么
也许你遇到过使用telnet或SSH远程登录linux,运行一些程序。如果这些程序需要运行很长时间(几个小时),而程序运行过程中出现网络故障,或者客户机故障,这时候客户机与远程服务器的链接将终端,并且远程服务器没有正常结束的命令将被迫终止。
又比如你SSH到主机上后,开始批量的scp命令,如果这个ssh线程断线了,scp进程就中断了。在远程服务器上正在运行某些耗时的作业,但是工作还没做完快要下班了,退出的话就会中断操作了,如何才好呢?
我们利用screen命令可以很好的解决这个问题。实现在断开SSH的情况下,在服务器上继续执行程序。
那什么是screen命令?
Screen被称之为一个全屏窗口管理器,用他可以轻松在一个物理终端上获得多个虚拟终端的效果。
Screen功能说明:
简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器,这意味着你能够使用一个单一的终端窗口运行多终端的应用。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。
当你使用多标签终端管理器,比如secureCRT的时候,也许会使用自动登录,或者每台服务器打开一个标签页,来回切换,有没有觉得都很麻烦呢,如果能一直保持着会话,不用每次都登陆或者切换,岂不是很方便,好吧,我建议你使用screen
什么情况下使用screen
除了上面说的之外,还需要一些必要条件,比如有人问那我能不能screen运行在本机,答案当然是可以,不过它本身就是一个程序,关机后进程都会被kill掉,screen自然也会断开所有链接,除非你自己的pc或者笔记本永不关机呵呵,不过那是不可能的,所以,还是使用中转服务器吧,比如在公司和企业里的开发测试人员用的那种,一般情况下不会随随便便关机的,而且比较稳定。
开始使用screen
- 首先要找到常年不关机并且稳定的机器(一般是自己的开发测试机),比如我们这里找到一台机器hostname为myserver,ip为192.168.1.101,我自己的机器ip为192.168.1.100
- 从你的本机ssh到myserver机器“ssh myserver/ssh 192.168.1.101” (建议打通ssh,参见: 设置 SSH 自动登陆)
- 假设myserver上你的个人目录为/home/taozi ,编辑文件/home/taozi/.screenrc ,内容如下:
-
01
#escape "^Tt"
02
03
#screen -t Shell 0
04
#screen -t Emacs 1 emacs -nw
05
#screen -t Bash 2 bash
06
#select 0
07
#kill
08
#select 1
09
vbell off
10
autodetach on
11
defscrollback 5000
12
#allpartial on
13
#partial on
14
15
#termcapinfo xterm ti@:te@
16
17
shelltitle
"$|bash"
18
19
#caption always "%{wb} %-w%{+b bw}%n %t%{-}%+w"
20
21
hardstatus on
22
hardstatus alwayslastline
23
# hardstatus string "%{.kW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "
24
# hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m/%d/%Y %{W}%c:%s %{g}]'
25
hardstatus string
'%{= kG} %{G}%H %{g}[%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}]%{B} %{W}%c %{g}'
26
27
bind g
28
bind ^g
29
bind L
30
31
#term screen-256color
32
term xterm
33
# attrcolor b ".I"
34
# bce on
35
36
altscreen on
37
38
defwrap on
39
defflow off
# for emacs C-x C-s
40
# encoding GBK GBK
41
encoding UTF8 UTF8
42
43
shell -$SHELL
- 为了防止ssh无操作或超时自动断开,我们做如下配置,编辑文件/home/taozi/.ssh/config
TCPKeepAlive yes ServerAliveInterval 50 ServerAliveCountMax 6
- 退出myserver,然后重新从本机ssh过去。
- 执行screen -S taozi_test (S为大写,taozi_test为你的screen名称,可自定义)
- 如无意外,可以看到我们已经进入screen的终端界面了,底部会显示当前的会话和时间
- 执行ctrl+a c ,可以看到新建了一个shell窗口,此时底部显示 0-$ bash (1*$bash)
- 不同shell窗口用数字表示,比如0,1,2 … , “-”表示上一个shell窗口, “*”表示当前所在的shell窗口
- 不同窗口之间切换使用ctrl+a n (n表示窗口的数字序号)
- 使用ctrl+a shift+a 可以重命名当前shell窗口的名字,便于快速切换
- 执行ctrl+a d ,可以退出screen(但是shell窗口和连接依然存在的),同时屏幕显示[detached] ,表示已经保存了当前screen
- 执行screen -ls ,可以查看当前所有screen的连接
- 执行screen -r taozi_test , 可以恢复screen界面
screen快捷键及其他功能
screen窗口内操作
- ctrl+a c:创建一个新的 window(可理解为shell窗口)
- ctrl+a ctrl-a:在 Shell 间切换
- ctrl+a n:切换到下一个 Shell
- ctrl+a p:切换到上一个 Shell
- ctrl+a 0…9:切换到指定 Shell
- ctrl+a d:退出 Screen 会话
- ctrl+a [ : 进入copy 模式,和vi一样使用
- ctrl+a shift+s : 切分窗口
- ctrl+a tab : 切分的窗口间切换
- ctrl+a shift+x : 关闭切分的窗口
screen本身的操作
- screen -S yourname -> 新建一个叫yourname的session
- screen -ls -> 列出当前所有的session
- screen -r yourname -> 回到yourname这个session
- screen -d yourname -> 远程detach某个session
- screen -d -r yourname -> 结束当前session并回到yourname这个session
在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始