介绍
Screen 是一个控制台应用程序,允许您在一个窗口中使用多个终端会话。 该程序在 shell 会话中运行,并充当其他终端会话的容器和管理器,类似于窗口管理器管理窗口的方式。
在许多情况下,创建多个终端窗口是不可能或不理想的。 您可能需要在没有运行 X 服务器的情况下管理多个控制台会话,您可能需要轻松访问许多远程云服务器,或者您可能需要在处理某些其他任务时监控正在运行的程序的输出。 借助屏幕的力量,所有需求都可以轻松解决。
安装
在本教程中,我们将使用 Ubuntu 12.04,但在安装过程之外,每个现代发行版上的一切都应该相同。
使用“apt-get”在 Ubuntu 上安装:
sudo apt-get update sudo apt-get install screen
基本用法
要开始一个新的屏幕会话,我们只需键入“screen”命令。
screen
Screen version 4.00.03jw4 (FAU) 2-May-06 Copyright (c) 1993-2002 Juergen Weigert, Michael Schroeder Copyright (c) 1987 Oliver Laumann This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program (see the file COPYING); if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Send bugreports, fixes, enhancements, t-shirts, money, beer & pizza to screen@uni-erlangen.de [Press Space for next page; Return to end.]
启动程序后,您会看到许可页面。 只需按“Return”或“Enter”继续。
接下来发生的事情可能令人惊讶。 我们得到了一个正常的命令提示符,看起来什么也没发生。 “屏幕”是否无法正常运行? 让我们尝试一个快速的键盘快捷键来找出答案。 按住控制键,然后按“a”键,然后按“v”键:
Ctrl-a v
screen 4.00.03jw4 (FAU) 2-May-06
我们刚刚从屏幕请求版本信息,并且我们收到了一些反馈,使我们能够验证屏幕 是否 运行正常。
现在是介绍我们将控制屏幕的方式的好时机。 屏幕主要通过键盘快捷键控制。 屏幕的每个键盘快捷键都以“Ctrl-a”开头(按住控制键的同时按下“a”键)。 该键击序列告诉屏幕它需要注意我们按下的下一个键。
当我们请求有关 screen 的版本信息时,您已经使用过此范例一次。 让我们用它来获取更多有用的信息。
Ctrl-a ?
Screen key bindings, page 1 of 2. Command key: ^A Literal ^A: a break ^B b license , removebuf = clear C lockscreen ^X x reset Z colon : log H screen ^C c copy ^[ [ login L select ' detach ^D d meta a silence _ digraph ^V monitor M split S displays * next ^@ ^N sp n suspend ^Z z dumptermcap . number N time ^T t fit F only Q title A flow ^F f other ^A vbell ^G focus ^I pow_break B version v hardcopy h pow_detach D width W help ? prev ^H ^P p ^? windows ^W w history { } quit \ wrap ^R r info i readbuf < writebuf > kill K k redisplay ^L l xoff ^S s lastmsg ^M m remove X xon ^Q q [Press Space for next page; Return to end.]
这是内部键盘快捷键屏幕。 您可能需要记住如何到达这里,因为它是一个极好的快速参考。 正如您在底部看到的,您可以按“空格”来获取更多命令。
好吧,让我们尝试一些更有趣的东西。 让我们在这个窗口中运行一个名为“top”的程序,它会显示一些关于我们的进程的信息。
top
top - 16:08:07 up 1:44, 1 user, load average: 0.00, 0.01, 0.05 Tasks: 58 total, 1 running, 57 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 507620k total, 262920k used, 244700k free, 8720k buffers Swap: 0k total, 0k used, 0k free, 224584k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 3384 1836 1288 S 0.0 0.4 0:00.70 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0 5 root 20 0 0 0 0 S 0.0 0.0 0:00.12 kworker/u:0 6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 7 root RT 0 0 0 0 S 0.0 0.0 0:00.07 watchdog/0 8 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 cpuset 9 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper 10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs 11 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns 12 root 20 0 0 0 0 S 0.0 0.0 0:00.03 sync_supers 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 bdi-default 14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd 15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd 16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 ata_sff 17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khubd 18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md
好的,我们现在正在监控 VPS 上的进程。 但是,如果我们需要运行一些命令来查找有关我们看到的程序的更多信息怎么办? 我们不需要退出“顶部”。 我们可以创建一个新窗口来运行这些命令。
Ctrl-a c
“Ctrl-a c”序列为我们创建了一个新窗口。 我们现在可以运行我们想要的任何命令,而不会中断我们在另一个窗口中进行的监控。
另一个窗口去哪儿了? 我们可以使用新命令返回它:
Ctrl-a n
此序列转到我们正在运行的下一个窗口。 窗口列表换行,因此当当前窗口之外没有窗口时,它会将我们切换回第一个窗口。
Ctrl-a p
此序列以相反的方向更改当前窗口。 因此,如果您有三个窗口并且当前位于第三个窗口,则此命令会将您切换到第二个窗口。
当您在相同的两个窗口之间切换时,一个有用的快捷方式是:
Ctrl-a Ctrl-a
此序列将您移至最近访问的窗口。 因此,在前面的示例中,这会将您移回第三个窗口。
此时,您可能想知道如何跟踪我们正在创建的所有窗口。 值得庆幸的是,screen 提供了多种不同的方式来管理您的不同会话。 首先,我们将为总共四个窗口创建三个新窗口,然后我们将尝试最简单的窗口管理工具之一,“Ctrl-a w”。
Ctrl-a c Ctrl-a c Ctrl-a c Ctrl-a w
0$ bash 1$ bash 2-$ bash 3*$ bash
我们从这个命令中得到一些有用的信息:我们当前窗口的列表。 在这里,我们有四个窗口。 每个窗口都有一个编号,窗口从“0”开始编号。 当前窗口的数字旁边有一个星号。
所以你可以看到我们当前在窗口#3(实际上是第四个窗口,因为第一个窗口是0)。 那么我们如何快速到达 1 号窗口呢?
Ctrl-a 1
我们可以使用索引号直接跳转到我们想要的窗口。 让我们再次查看我们的窗口列表。
Ctrl-a w
0$ bash 1*$ bash 2$ bash 3-$ bash
如您所见,星号告诉我们现在位于窗口#1。 让我们尝试另一种切换窗口的方式。
Ctrl-a “
Num Name Flags 0 bash $ 1 bash $ 2 bash $ 3 bash $
这次我们得到了一个实际的导航菜单。 您可以使用向上和向下箭头或使用“j”和“k”进行导航,就像在 vi 文本编辑器中一样。 按“Return”或“Enter”切换到一个窗口。
这非常有用,但现在我们所有的窗口都被命名为“bash”。 这不是很有帮助。 让我们命名我们的一些会话。 切换到要命名的窗口,然后使用“Ctrl-a A”序列。
Ctrl-a 0 Ctrl-a A
Set window's title to: bash
使用“Ctrl-a A”序列,我们可以命名我们的会话。 您现在可以在“bash”上退格,然后将其重命名为您喜欢的任何名称。 我们将再次在窗口#0 上运行“top”,因此我们将其命名为“monitoring”。
Set window's title to: monitoring
Ctrl-a “
Num Name Flags 0 monitoring $ 1 bash $ 2 bash $ 3 bash $
现在我们为窗口#0 提供了一个更有用的标签。 所以我们知道如何创建和命名窗口,但是当我们不再需要它们时,我们如何摆脱它们呢? 我们使用“Ctrl-ak”序列,它代表“kill”。
Ctrl-a k
Really kill this window [y/n]
管理屏幕会话
当您想退出屏幕并杀死所有窗口时,可以使用此命令序列。
Ctrl-a \
Really quit and kill all your windows [y/n]
这将破坏我们的屏幕会话。 我们将丢失我们创建的任何窗口和任何未完成的工作。
但我们想探索使用“屏幕”的巨大好处之一。 我们不想破坏会话,我们只是想分离它。 分离允许我们在屏幕实例中的程序继续运行,但它使我们能够访问我们的基本控制台会话(我们最初启动“屏幕”的地方)。 屏幕会话仍然存在,它只是在后台进行管理。
Ctrl-a d
[detached from 1835.pts-0.Blank]
所以我们的会话现在是分离的。 我们如何回到它?
screen –r
“r”代表重新连接。 我们现在回到我们的屏幕会话。 如果我们有多个屏幕会话怎么办? 如果我们启动一个屏幕会话并将其分离,然后启动一个 new 屏幕会话并将其分离,该怎么办?
screen Ctrl-a d screen Ctrl-a d
我们如何告诉屏幕要附加哪个会话?
screen –ls
There are screens on: 2171.pts-0.Blank (07/01/2013 05:00:39 PM) (Detached) 1835.pts-0.Blank (07/01/2013 03:50:43 PM) (Detached) 2 Sockets in /var/run/screen/S-justin.
现在我们有了一个会话列表。 我们可以通过在“-r”标志后面输入它的 ID 号来重新附加第二个。
screen –r 1835
如果您想在两台单独的计算机或终端窗口上附加会话怎么办? 您可以使用“-x”标志,它可以让您共享会话。
screen –x
在屏幕内管理终端
有许多命令可以帮助您管理在 screen 中运行的终端会话。
要复制文本,您可以使用以下序列:
Ctrl-a [
这将为您提供一个光标,您可以使用箭头键或 h、j、k、l 键(如 vi)移动该光标。 移动到要开始复制的位置,然后点击“Return”或“Enter”。 移动到您要复制的位置的末尾,然后再次点击“Return”或“Enter”。 然后将文本复制到剪贴板。
需要注意的一件事是,这也是屏幕的滚动机制。 如果您需要查看一些不在屏幕上的文本,您可以点击“Ctrl-a [”,然后向上滚动到屏幕之外。
我们可以用右括号粘贴我们复制的文本。
Ctrl-a ]
您可能想做的另一件事是监视在另一个屏幕窗口中执行的程序。
假设您正在一个窗口中编译某些内容,并且您想知道它何时完成。 您可以使用“Ctrl-a _”序列让屏幕监视该窗口是否静音,这将告诉您何时 30 秒内没有生成输出。
让我们用一个更简单的例子来试试。 让屏幕告诉我们窗口何时完成 ping google 4 次。
ping –c 4 www.google.com Ctrl-a _
The window is now being monitored for 30 sec. silence.
现在我们可以在另一个窗口中工作,并在此窗口中的任务完成时收到警报。
Ctrl-a 1
Window 2: silence for 30 seconds
我们也可以做相反的事情,并在特定窗口上发生活动时收到警报。 我们通过“Ctrl-a M”序列完成此操作。
sleep 20 && echo “output” Ctrl-a M
Window 2 (bash) is now being monitored for all activity.
当命令产生输出时,我们现在会收到警报。
Ctrl-a 1
Activity in window 2
假设我们将要进行一些重要的更改,并且我们想要记录我们运行的所有命令。 我们可以使用以下命令记录会话:
Ctrl-a H
Creating logfile "screenlog.1".
屏幕区域
如果我们需要同时查看多个窗口,我们可以使用屏幕上称为“区域”的东西。 我们通过拆分当前区域来创建更多区域。 要水平分割当前区域,我们可以输入:
Ctrl-a S
这会将我们当前的窗口移动到屏幕的上半部分,并在其下方打开一个新的空白区域。 我们可以使用“tab”键进入下屏:
Ctrl-a [tab]
然后我们可以在底部区域创建一个新窗口或以正常方式将视图更改为不同的窗口。
如果我们想杀死当前区域,我们可以使用这个序列:
Ctrl-a X
这会破坏该区域而不会破坏实际的窗口。 这意味着如果您在该区域中运行程序,您仍然可以将其作为普通窗口访问,进入该窗口的视图被简单地破坏了。
如果我们想进行垂直分割,我们可以使用这个序列来代替:
Ctrl-a |
注意:那不是 1(数字一)或 L 字符。 它是“管道”字符,与大多数键盘上的“\”在同一个键上。
垂直拆分的控件与水平拆分相同。 如果我们添加了几个不同的区域并且想要返回到单个区域,我们可以使用这个序列,它会破坏除当前区域之外的所有区域。
Ctrl-a Q
使用屏风
屏幕的一大改进是一个名为“byobu”的程序。 它充当屏幕的包装器并提供增强的用户体验。 在 Ubuntu 上,您可以使用以下命令安装它:
sudo apt-get install byobu
在开始之前,我们需要告诉 byobu 使用 screen 作为后端。 我们可以使用以下命令来做到这一点:
byobu-select-backend
Select the byobu backend: 1. tmux 2. screen Choose 1-2 [1]:
我们可以在这里选择 screen 将其设置为默认的终端管理器。
现在,您可以输入“byobu”,而不是输入“screen”来开始会话。
byobu
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-24-virtual i686) * Documentation: https://help.ubuntu.com/ Welcome to the light, powerful, text window manager, Byobu. You can toggle the launch of Byobu at login with: 'byobu-disable' and 'byobu-enable' For tips, tricks, and more information, see: * http://bit.ly/byobu-help justin@Blank:~$ u? 12.04 0:* 118! 3h55m 2.00 2.0GHz 496M6% 2013-07-01 18:19:21
如您所见,您现在将屏幕包裹在一个漂亮的界面中。
当您第一次键入“Ctrl-a”时,您必须告诉 byobu 将其识别为屏幕命令而不是 Emacs 命令。
Ctrl-a
Configure Byobu's ctrl-a behavior... When you press ctrl-a in Byobu, do you want it to operate in: (1) Screen mode (GNU Screen's default escape sequence) (2) Emacs mode (go to beginning of line) Note that: - F12 also operates as an escape in Byobu - You can press F9 and choose your escape character - You can run 'byobu-ctrl-a' at any time to change your selection Select [1 or 2]:
选择“1”正常使用byobu。
该界面为您提供了许多有用的信息,例如窗口列表和系统信息。 在 Ubuntu 上,它甚至会告诉您有多少软件包具有安全更新,数字后面是红色背景上的感叹号。
使用 byobu 和 screen 之间的不同之处在于 byobu 实际管理会话的方式。 如果您在分离后再次键入“byobu”,它只会重新连接您之前的会话,而不是创建一个新会话。
要创建新会话,您必须键入:
byobu –S sessionname
将“会话名称”更改为您想要调用新会话的任何名称。 您可以查看当前会话列表:
byobu –ls
There are screens on: 22961.new (07/01/2013 06:42:52 PM) (Detached) 22281.byobu (07/01/2013 06:37:18 PM) (Detached) 2 Sockets in /var/run/screen/S-root.
如果有多个会话,当您键入“byobu”时,您将看到一个菜单来选择您想要连接到哪个会话。
byobu
Byobu sessions... 1. screen: 22961.new (07/01/2013 06:42:52 PM) (Detached) 2. screen: 22281.byobu (07/01/2013 06:37:18 PM) (Detached) 3. Create a new Byobu session (screen) 4. Run a shell without Byobu (/bin/bash) Choose 1-4 [1]:
您可以选择任何当前会话,创建一个新的 byobu 会话,甚至在不使用 byobu 的情况下获得一个新的 shell。
在您远程管理的云服务器上可能有用的一个选项是让 byobu 在您登录会话时自动启动。 这意味着,如果您与会话断开连接,您的工作不会丢失,您只需重新连接即可回到之前的位置。
要使 byobu 在每次登录时自动启动,请在终端中键入:
byobu-enable
The Byobu window manager will be launched automatically at each text login. To disable this behavior later, just run: byobu-disable Press to continue...
正如它所说,如果您想再次关闭此功能,只需键入:
byobu-disable
它将不再自动启动。