Linux使用:screen
# 背景
解决痛点:ssh 终端断掉!
# 工具
GNU Screen简称Screen或screen,源自GNU计划。
主要功能:
- 会话恢复:只要 screen 命令本身没有终止,那么内部运行的会话就可以恢复。
- 会话管理:基于 screen 创建和管理多个会话。
- 会话共享。
# 方法
1、登录远程终端后,使用 screen -R 会话名
创建一个新的会话,然后正常使用即可。
2、如果终端断掉,再次连接是,我们使用 screen -R 会话名
即可恢复之前的会话。
# 举例
1、登录到系统,创建会话,正常使用
# 登录到系统
[zhenggang@ln1%tianhe ~]$
# 创建一个 screen 会话
[zhenggang@ln1%tianhe ~]$ screen -R work
[zhenggang@ln1 ~]$
# 正常使用
[zhenggang@ln1 ~]$ date
Tue Dec 21 08:53:45 CST 2021
2
3
4
5
6
7
8
9
10
2、正常退出会话
# 退出该会话并删除
[zhenggang@ln1 ~]$ exit
# 显示:[screen is terminating]
# 或者退出该会话并保持
# 使用快捷键:按住 ctrl + a,然后(继续安装 ctrl 的情况话)再按 d
# 显示:[detached]
2
3
4
5
6
7
3、意外退出或终端断掉情况下,重新登录到系统,并链接回之前的会话
# 登录到系统
[zhenggang@ln1%tianhe ~]$
# 连接到之前的 screen 会话
[zhenggang@ln1%tianhe ~]$ screen -R work
[zhenggang@ln1 ~]$
2
3
4
5
6
这样就可以继续之前的工作了,
# 命令参数表
screen,通常的命令格式为:
screen [-opts] [cmd [args]]
功能 | 命令 | 功能说明 |
---|---|---|
查看 | screen -ls | 查看已有会话列表(Attached 表示活跃,Detached 表示非活跃) |
创建并进入 | screen | 直接创建一个会话 |
创建并进入 | screen -S work | 创建一个新会话 work 并进入,如果该会话名已存在,则会创建一个新的同名会话 |
创建并进入 | screen -R work | 创建一个新会话 work 并进入,如果该会话名已存在,则会直接进入 |
退出 | ctrl + a ,然后按 d | 按快捷键 ctrl + a,然后 按 d 退出当前会话 |
恢复 | screen -r work | 回到名为 work 的会话,如果该会话不存在,则会创新一个名为 work 的会话 |
删除 | screen -r work ,然后 exit | 先进入名为 work 的会话,然后通过 exit 进行删除 |
删除 | screen -R work -X quit | 直接通过命令删除名为 work 的会话 |
# 命令参数详解
# 查看命令是否存在
$ which screen
/usr/bin/screen
2
如果没有正常显示 screen
命令的路径,说明该命令没有安装,使用管理员账号 root
进行安装。
如果是 redhat / centos 系统,使用
yum install screen
安装即可;如果是 ubuntu 系统,使用apt-get install screen
命令即可。但是如果你没有系统管理员账号,请联系系统管理员吧。
# 创建并进入
方法1:直接输入screen
命令,即可创建会话。
$ screen
这样创建的会话名称是 随机名称(包含当前登录节点的 hostname )
方法2:使用 screen -S 会话名
创建会话,例如创建名为 work
的会话
$ screen -S work
如果之前存在同名的会话,则会创建新的同名会话
方法3:使用 screen -R 会话名
创建会话,例如创建名为 work
的会话(推荐!)
$ screen -R work
如果之前存在同名的会话,则会直接进入,因此推荐
# 退出
在已经进入某一个由 screen
创建的会话时:
方法1:可以直接输入 exit
命令,退出当前会话,并删除该会话。
$ exit
方法2:也可以通过快捷键先按 ctrl+a
,(保持按住ctrl的状态)再按d
,退出当前会话,但该会话不会被删除。
# 查看列表
$ screen -ls
状态说明:
- Attached:表示当前screen正在作为主终端使用,为活跃状态。
- Detached:表示当前screen正在后台使用,为非活跃状态。
# 恢复
# 使用 pid 或者 Name 恢复会话
$ screen -r [pid/Name] # 命令格式
$ screen -ls
# 先查看可用会话
$ screen -ls
There is a screen on:
152350.work (Attached)
1 Socket in /var/run/screen/S-zhenggang.
# 再恢复会话
$ screen -r 152350 # 使用 pid 恢复会话,如果不存在则会提示不存在
$ screen -r work # 使用 Name 恢复会话,如果不存在则会提示不存在
$ screen -R work # 尝试恢复名为 work 的会话,如果不存在则创建新的
2
3
4
5
6
7
8
9
10
11
12
13
# 删除
方法1:进入该会话,然后输出 exit
(推荐)
# 进入会话
screen -R [pid/Name]
# 退出
exit
2
3
4
方法2:使用 screen
命令删除
# 使用-R/-r/-S均可
screen -R [pid/Name] -X quit
2
# 实战教学
按照如下方法重复几次,即可初步掌握 screen 的常用初级功能。
# 1、查看命令是否存在
# 如果没有正常显示 `screen` 命令的路径,说明该命令没有安装,使用管理员账号 `root` 进行安装。
# 如果是 redhat / centos 系统,使用 `yum install screen` 安装即可;如果是 ubuntu 系统,使用 `apt-get install screen` 命令即可。但是如果你没有系统管理员账号,请联系系统管理员吧。
$ which screen
/usr/bin/screen
# 2、直接输入 screen 命令创建并进入一个新的会话
$ screen
# 此时已经在该会话中了
# 3、使用 screen -ls 查看会话列表
# 看到有一个会话处于 Attached 状态
$ screen -ls
There is a screen on:
226100.pts-39.ln1 (Attached)
1 Socket in /var/run/screen/S-zhenggang.
# 注意:226100.pts-39.ln1 是随机生成的会话名称,该名称不好记忆,因此不推荐直接使用 screen 进行创建
# 4、退出当前会话,并删除该会话
$ exit
# 5、查看会话列表
# 并未发现可用会话
$ screen -ls
No Sockets found in /var/run/screen/S-zhenggang.
# 6、使用 screen -R 会话名 创建会话,例如创建名为 work 的会话
$ screen -R work
# 7、使用 screen -ls
$ screen -ls
There is a screen on:
152350.work (Attached)
1 Socket in /var/run/screen/S-zhenggang.
# 8、退出当前会话并保留该会话
# 通过 快捷键 ctrl + a ,再按 d ,退出该会话并保留该会话
# 屏幕会显示:[detached]
# 9、使用 screen -ls
$ screen -ls
There is a screen on:
152350.work (Detached)
1 Socket in /var/run/screen/S-zhenggang.
# 10、通过 pid 回到该会话
$ screen -r 152350
# 11、再次使用 screen -ls 查看会话列表
# 此时该会话状态为 Attached
$ screen -ls
There is a screen on:
152350.work (Attached)
1 Socket in /var/run/screen/S-zhenggang.
# 12、再次使用快捷键退出并保存会话(快捷键 ctrl + a ,再按 d)
# 屏幕会显示:[detached]
# 13、通过 会话名 回到该会话
$ screen -r work
# 14、 再次使用 screen -ls 查看会话列表
# 此时该会话状态为 Attached
$ screen -ls
There is a screen on:
152350.work (Attached)
1 Socket in /var/run/screen/S-zhenggang.
# 15、使用 exit 命令 退出会话,并删除该会话
$ exit
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# 进阶内容
screen 还可以进行分屏、创建共享会话、会话加密解密等功能,在此不再赘述。
感兴趣的话,可以阅读相关博客文章,或者官方文档:
# 参考
- Linux终端命令神器--Screen命令详解 (opens new window)
- linux screen 命令详解 (opens new window)
- screen 命令,Linux screen 命令详解 (opens new window)
# 附录
# screen内中文输出乱码
方法1:在创建和查看虚拟终端时,加上-U
参数:
# 新建对话
$ screen -U -S new_screen
# 切换会话(utf8编码查看)
$ screen -U -r new_screen
2
3
4
方法2:修改配置文件
新建或修改文件:
$ vim ~/.screenrc
加入以下设置:
defutf8 on
defencoding utf8
encoding UTF-8 UTF-8
2
3
# screen 命令查询
$ screen -h
Use: screen [-opts] [cmd [args]]
or: screen -r [host.tty]
Options:
-4 Use IPv4.
-6 Use IPv6.
-a Force all capabilities into each window's termcap.
-A -[r|R] Adapt all windows to the new display width & height.
-c file Read configuration file instead of '.screenrc'.
-d (-r) Detach the elsewhere running screen (and reattach here).
-dmS name Start as daemon: Screen session in detached mode.
-D (-r) Detach and logout remote (and reattach here).
-D -RR Do whatever is needed to get a screen session.
-e xy Change command characters.
-f Flow control on, -fn = off, -fa = auto.
-h lines Set the size of the scrollback history buffer.
-i Interrupt output sooner when flow control is on.
-l Login mode on (update /var/run/utmp), -ln = off.
-list or -ls. Do nothing, just list our SockDir.
-L Turn on output logging.
-m ignore $STY variable, do create a new screen session.
-O Choose optimal output rather than exact vt100 emulation.
-p window Preselect the named window if it exists.
-q Quiet startup. Exits with non-zero return code if unsuccessful.
-r Reattach to a detached screen process.
-R Reattach if possible, otherwise start a new session.
-s shell Shell to execute rather than $SHELL.
-S sockname Name this session <pid>.sockname instead of <pid>.<tty>.<host>.
-t title Set title. (window's name).
-T term Use term as $TERM for windows, rather than "screen".
-U Tell screen to use UTF-8 encoding.
-v Print "Screen version 4.00.03 (FAU) 23-Oct-06".
-wipe Do nothing, just clean up SockDir.
-x Attach to a not detached screen. (Multi display mode).
-X Execute <cmd> as a screen command in the specified session.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36