官网介绍
Screen is a full-screen window manager that multiplexes a physical terminal between several processes, typically interactive shells. Each virtual terminal provides the functions of the DEC VT100 terminal and, in addition, several control functions from the ANSI X3.64 (ISO 6429) and ISO 2022 standards (e.g., insert/delete line and support for multiple character sets). There is a scrollback history buffer for each virtual terminal and a copy-and-paste mechanism that allows the user to move text regions between windows. When screen is called, it creates a single window with a shell in it (or the specified command) and then gets out of your way so that you can use the program as you normally would. Then, at any time, you can create new (full-screen) windows with other programs in them (including more shells), kill the current window, view a list of the active windows, turn output logging on and off, copy text between windows, view the scrollback history, switch between windows, etc. All windows run their programs completely independent of each other. Programs continue to run when their window is currently not visible and even when the whole screen session is detached from the users terminal.
Screen 是全屏幕窗口管理器,它在多个进程(通常是交互式 Shell)之间,多路复用物理终端。每个虚拟终端提供 DEC VT100 终端的功能,另外,还提供来自 ANSI X3.64(ISO 6429)和 ISO 2022 标准(比如,插入/删除行,以及支持多种字符集)的若干控制功能。每个虚拟终端有一个滚动历史缓冲区,并且拥有允许用户在窗口之间移动文本区域的拷贝-粘贴机制。当调用 screen
命令时,它创建带有 Shell(或指定命令)的单个窗口,然后可以像平常一样使用该程序。然后,可以随时在其中使用其它程序创建新(全屏幕)窗口(包括更多 Shell),杀死当前窗口,查看活跃窗口列表,打开/关闭输出日志,在窗口之间拷贝文本,查看滚动历史,在窗口之间切换等。所有窗口彼此完全独立地运行它们的程序。程序持续运行到它们的窗口当前不可见,甚至当从用户终端脱离整个 Screen 会话时。
Screen 以会话(Session)为基础,向用户提供终端复用功能。会话是后台运行的程序,在其中可以执行命令,创建新窗口等,不同的会话包含不同的运行内容。当终端连接(attach)到特定会话时,终端将显示该会话的信息,包括会话中包含的窗口、执行的命令及输出等。当终端脱离(detach)当前会话时,终端将不再显示会话的内容,但会话仍然在后台独立地运行,仅当会话中没有正在运行的程序时(包括窗口中运行的 Shell 程序),会话自动结束。
常用的选项包括:
-S sockname
:将该会话命名为 <pid>.sockname,默认命名为 <pid>.<tty>.<host>。
比如:
创建会话
$ screen -S screen-test
按 CTRL + a + d,脱离当前会话
列出会话
$ screen -ls
There is a screen on:
15432.screen-test (Detached)
1 Socket in /var/run/screen/S-root.
可见,当前存在 1 个会话,PID 是 15432,该会话的状态是 Detached
-r [session]
:重新连接到一个 Detached 进程(重新连接会话要求会话的状态为 Detached)。
比如:
# 使用名称,连接会话
$ screen -r screen-test
或
# 使用 PID,连接会话
$ screen -r 15432
连接到会话后,可以在其中执行程序,比如:
$ sleep 86400s
然后按 CTRL + a + d,脱离当前会话,会话将在后台独立运行
-X
:在指定的会话中,执行 <cmd> 作为 Screen 命令。
比如:
# 可以通过如下方式,终止上一步创建的会话
$ screen -S screen-test -X quit
# 列出会话。可以看到会话已经终止
$ screen -ls
终止会话的另一种方式是:连接到会话,然后输入
exit
命令
-wipe [match]
:不做任何事情,仅清理 SockDir[在可能的匹配上]。
当会话中运行的最后一个进程退出时,会话自动结束。如果会话非自然结束,那么通过 screen -ls
可以看到其状态为 Dead ???
。可以使用 screen -wipe
清理这些会话。比如:
# 创建会话
$ screen -dmS wipe-test sleep infinity
# 查看会话
$ screen -ls
There is a screen on:
16263.wipe-test (Detached)
1 Socket in /var/run/screen/S-root.
# **强制**杀死会话进程
$ kill -9 16263
# 查看会话。可以看到被强制杀死的会话的状态为 Dead???
$ screen -ls
There is a screen on:
16263.wipe-test (Dead ???)
Remove dead screens with 'screen -wipe'.
1 Socket in /var/run/screen/S-root.
# 清理死亡会话
$ screen -wipe
There is a screen on:
16263.wipe-test (Removed)
1 socket wiped out.
No Sockets found in /var/run/screen/S-root.
# 查看会话。可以看到死亡会话已被清理
$ screen -ls
No Sockets found in /var/run/screen/S-root.
-d
:脱离在别处正在运行的会话。
比如:
创建新会话 detach-test-1:
$ screen -S detach-test-1
在会话 detach-test-1 中,创建新会话 detach-test-2:
$ screen -S detach-test-2
查看会话:
$ screen -ls
There are screens on:
16622.detach-test-2 (Attached)
16590.detach-test-1 (Attached)
2 Sockets in /var/run/screen/S-root.
查看当前在哪个会话中:
$ echo $STY
16622.detach-test-2
脱离会话 detach-test-1:
# 带参数
$ screen -d detach-test-1
[remote detached from 16590.detach-test-1]
查看会话:
$ screen -ls
There are screens on:
16622.detach-test-2 (Attached)
16590.detach-test-1 (Detached)
2 Sockets in /var/run/screen/S-root.
脱离当前会话(即会话 detach-test-2):
# 不带参数
$ screen -d
查看会话:
$ screen -ls
There are screens on:
16622.detach-test-2 (Detached)
16590.detach-test-1 (Detached)
2 Sockets in /var/run/screen/S-root.
可见两个会话的状态都已变成 Detached。查看当前是否在 Screen 会话中:
# 输出为空,表示不在任何会话中
$ echo $STY
-m
:忽略 $STY 变量,创建新会话
-dmS name
:以守护进程的方式启动,在 Detached 模式中,启动 Screen 会话。(命令执行完毕,会话自动退出。)
比如,前面的例子中的:
screen -dmS wipe-test sleep infinity
-ls [match]
或 -list
:不做任何事情,只列出 SockDir[在可能的匹配上]
-x
:连接到一个非 Detached 会话。(多显示模式)。
比如:
在一个终端中创建会话:
$ screen -S share-test
打开另一个终端,连接到刚才创建的会话:
$ screen -x share-test
可以在第二个终端中看到第一个终端中执行的命令;反之亦然
-D (-r)
:脱离及退出远程会话(并且在此处重新连接)
可以通过以下方式使用 Screen 的功能:
screen [operation]
格式的命令。可在任何可执行命令行操作的终端中运行在 Screen 创建的窗口中,默认情况下,用户的按键直接作为终端的输入,仅当用户输入特定的命令前缀(Prefix)时,才会根据 Screen 与按键的绑定情况将后续的输入解释为特定的 Screen 操作。 Screen 默认的命令前缀为 CTRL + a,在输入命令前缀后,用户键入 Screen 支持的功能按键,即可执行指定的 Screen 操作。
只能在已连接的会话中,进行窗口的管理。常用的窗口管理方式有两种:
screen
命令由于 Screen 会话提供的窗口一般用于执行用户命令,故在命令行输入命令的方式不总是可用。下面是说明各操作的功能的表格(已省略命令前缀 CTRL + a)。注意,也可以通过在命令行输入命令的方式实现下述窗口管理功能,具体细节请参考 Screen 的 man 文档。
分类 | 操作 | 功能 |
---|---|---|
创建和切换 | c(create) | 创建带有 Shell 的新窗口,并且切换至新窗口 |
创建和切换 | k(kill) | 杀死当前窗口,切换到下一个窗口。如果当前窗口是最后一个窗口,那么终止会话 |
创建和切换 | d(detach) | 脱离当前会话 |
创建和切换 | i(info) | 显示当前窗口的信息 |
创建和切换 | w(windows) | 显示所有窗口的序号 |
创建和切换 | " | 显示所有窗口,以供切换 |
创建和切换 | num(0 - 9 之间的数字) | 切换至序号为 num 的窗口 |
创建和切换 | n(next) | 切换到下一个窗口 |
创建和切换 | p(previous) | 切换到前一个窗口 |
划分和管理 | S(split) | 将当前窗口水平划分成两个窗口 |
划分和管理 | | | 将当前窗口垂直划分成两个窗口 |
划分和管理 | TAB | 在不同区域间顺序切换 |
划分和管理 | Q(only) | 删除当前区域外的所有区域 |
划分和管理 | X(eXchange) | 删除当前区域。交换当前区域和下一个区域的位置,从而实现删除当前区域的效果 |
辅助功能 | C(clear) | 清屏 |
辅助功能 | H(Hardcopy) | 开始/结束记录当前窗口的输出,输出被保存在名为 "screenlog.n" 文件中 |
辅助功能 | ? | 显示按键与功能的绑定 |
辅助功能 | [ | 进入复制模式 |
辅助功能 | ] | 将复制模式中复制的内容粘贴 |
辅助功能 | x(Lock) | 锁定屏幕,需要输入密码才能解锁 |
创建会话:
xxxxxxxxxx
$ screen -S copy-test
在窗口中,输入命令:
xxxxxxxxxx
$ date
同时按 CTRL + a,然后松开,再按 [ 或 ESC,进入拷贝模式。
按 h(左,或 Page-Left)、j(下,或 Page-Down)、k(上,或 Page-UP)、l(右,或 Page-Right),将光标移动到开始位置。
按 SPACE(空格),开始复制。
按 h(左,或 Page-Left)、j(下,或 Page-Down)、k(上,或 Page-UP)、l(右,或 Page-Right),将光标移动到结束位置。
按 ENTER(回车),执行复制,并且退出拷贝模式。
按 CTRL + a,松开后,按 ],进行粘贴。
先进入拷贝模式,然后将光标移动到想要查看的位置,最后按 q 放弃复制模式。
快捷键 | 功能 |
---|---|
CTRL + a + a | 先按 CTRL + a,松开后,再按 a。移动到行首 |
CTRL + e(end) | 移动到行尾 |
CTRL + f(forward) | 向前移动一个字符 |
CTRL + b(back) | 向后移动一个字符 |
CTRL + k(kill) | 删除光标到行尾 |
CTRL + u(unix) | 删除光标到行首 |
CTL + y(yank) | 粘贴之前删除的文本 |