如何在 Ubuntu 云服务器上安装和使用 Screen
介绍
Screen 是一个控制台应用程序,允许您在一个窗口中使用多个终端会话。该程序在 shell 会话中运行,并充当其他终端会话的容器和管理器,类似于窗口管理器管理窗口的方式。
在很多情况下,创建多个终端窗口是不可能或不理想的。您可能需要在没有运行 X 服务器的情况下管理多个控制台会话,您可能需要访问许多远程云服务器,或者您可能需要在处理其他任务时监视正在运行的程序的输出。
这个问题有现代的一体化解决方案,比如 tmux,但 screen
是其中最成熟的,它有自己强大的语法和功能。
第 1 步 – 安装屏幕
在本教程中,我们将使用 Ubuntu 22.04,但在安装过程之外,每个现代 Linux 发行版上的一切都应该是相同的。
Screen 通常默认安装在 Ubuntu 上。您还可以使用 apt
更新您的包源并安装 screen
:
- sudo apt update
- sudo apt install screen
通过运行 which screen
验证是否安装了 screen
:
- which screen
Output/usr/bin/screen
您可以在下一步中开始使用 screen
。
第 2 步 – 使用屏幕
要启动新的屏幕会话,请运行 screen
命令。
- screen
[secondary_label Output
GNU Screen version 4.09.00 (GNU) 30-Jan-22
Copyright (c) 2018-2020 Alexander Naumov, Amadeusz Slawinski
Copyright (c) 2015-2017 Juergen Weigert, Alexander Naumov, Amadeusz Slawinski
Copyright (c) 2010-2014 Juergen Weigert, Sadrul Habib Chowdhury
Copyright (c) 2008-2009 Juergen Weigert, Michael Schroeder, Micah Cowan, Sadrul Habib
Chowdhury
Copyright (c) 1993-2007 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.
…
[Press Space for next page; Return to end.]
启动程序后,您会看到许可页面。只需按 Enter 继续。
接下来发生的事情可能会令人惊讶。我们得到了一个正常的命令提示符,看起来什么也没发生。 screen
是否无法正确运行?让我们尝试使用快速键盘快捷键来找出答案。按 Ctrl+a
,然后按 v
:
Outputscreen 4.09.00 (GNU) 30-Jan-22
我们刚刚从 screen 请求了版本信息,并且我们收到了一些反馈,使我们能够验证 screen 是否正常运行。
现在是介绍我们控制 screen
的方式的好时机。屏幕主要通过键盘快捷键控制。 screen
的每个键盘快捷键都以 Ctrl-a
开头(按住 control 键的同时按下 \a 键)。击键序列告诉 screen
它需要注意我们按下的下一个键。
当我们请求有关 screen
的版本信息时,您已经使用过一次这种范例。让我们使用它来获取一些更有用的信息,方法是输入 Ctrl-a ?
:
Output 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
Outputtop - 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 上的进程。但是,如果我们需要运行一些命令来查找有关我们看到的程序的更多信息怎么办?我们不需要退出“top”。我们可以创建一个新窗口来运行这些命令。
Ctrl-a c
序列为我们创建了一个新窗口。我们现在可以运行任何我们想要的命令,而不会中断我们在另一个窗口中所做的监控。
另一个窗口去哪儿了?我们可以使用 Ctrl-a n
返回它。
此序列转到我们正在运行的下一个窗口。窗口列表换行,所以当当前窗口之外没有任何窗口时,它会将我们切换回第一个窗口。
Ctrl-a p
以相反的方向改变当前窗口。因此,如果您有三个窗口并且当前位于第三个窗口,则此命令会将您切换到第二个窗口。
在相同的两个窗口之间切换时使用的一个有用的快捷方式是 Ctrl-a Ctrl-a
。
此序列将您移至最近访问的窗口。所以在前面的例子中,这会让你回到你的第三个窗口。
此时,您可能想知道如何跟踪我们正在创建的所有窗口。值得庆幸的是,screen 提供了许多不同的方式来管理您的不同会话。首先,我们将为总共四个窗口创建三个新窗口,然后我们将尝试 Ctrl-a w
,Screen 的窗口管理工具之一。输入 Ctrl-a c Ctrl-a c Ctrl-a c Ctrl-a w
:
Output0$ bash 1$ bash 2-$ bash 3*$ bash
我们从这个命令中得到了一些有用的信息:我们当前窗口的列表。在这里,我们有四个窗口。每个窗口都有一个编号,窗口从“0”开始编号。当前窗口的编号旁边有一个星号。
所以你可以看到我们目前在 #3 窗口(实际上是第四个窗口,因为第一个窗口是 0)。您可以使用 Ctrl-a 1
快速返回到窗口 #1。
我们可以使用索引号直接跳转到我们想要的窗口。让我们使用 Ctrl-a w
再次查看我们的窗口列表:
Output0$ bash 1*$ bash 2$ bash 3-$ bash
如您所见,星号告诉我们现在位于 #1 窗口。让我们尝试使用 Ctrl-a “
切换窗口的不同方式:
OutputNum Name Flags
0 bash $
1 bash $
2 bash $
3 bash $
这次我们得到了一个实际的导航菜单。您可以使用向上和向下箭头进行导航。按 Enter 键切换到一个窗口。
这非常有用,但现在我们所有的窗口都被命名为 \bash。这不是很有帮助。让我们为我们的一些会话命名。切换到您想要命名的窗口,例如使用 Ctrl-a 0
然后使用 Ctrl-a A
:
OutputSet window's title to: bash
使用 Ctrl-a A
序列,我们可以命名我们的会话。您现在可以在 \bash 上退格,然后根据需要重命名它。我们将再次在窗口 #0 上运行 top
,因此我们将其命名为 监控
。
使用 Ctrl-a “
验证结果:
OutputNum Name Flags
0 monitoring $
1 bash $
2 bash $
3 bash $
现在我们有一个更有用的窗口 #0 标签。所以我们知道如何创建和命名窗口,但是当我们不再需要它们时我们如何摆脱它们呢?我们使用 Ctrl-a k
序列,它代表“kill”。
OutputReally kill this window [y/n]
第 3 步 – 管理屏幕会话
当您想退出 screen
并关闭所有窗口时,可以使用 Ctrl-a \
。
OutputReally quit and kill all your windows [y/n]
这将破坏我们的屏幕会话。我们将丢失我们创建的所有窗口和任何未完成的工作。
但是我们想探索使用“screen”的巨大好处之一。我们不想破坏会话,我们想分离它。分离允许我们在屏幕实例中的程序继续运行,但它给了我们访问我们的基本控制台会话(我们最初开始“屏幕”的会话)。屏幕会话仍然存在,它只会在后台进行管理。使用 Ctrl-a d
分离。
Output[detached from 1835.pts-0.Blank]
所以我们的会话现在是分离的。我们如何回到它?
- screen –r
-r
标志代表重新附加。我们现在回到屏幕会话中。如果我们有多个屏幕会话怎么办?如果我们已经开始一个屏幕会话并将其分离,然后开始一个新的屏幕会话并将其分离怎么办?
尝试运行 screen
,然后使用 Ctrl-a d
分离,然后再次运行 screen
,然后使用 Ctrl-a d分离代码>再次。
我们如何告诉 screen
要附加哪个会话?
- screen –ls
OutputThere 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
第 4 步 – 在屏幕内管理终端
有许多命令可帮助您管理在 screen
中运行的终端会话。
要复制文本,您可以使用 Ctrl-a [
。
这将为您提供一个光标,您可以使用箭头键或 HJKL 移动该光标。移至要开始复制的位置,然后按 Enter。移动到您要复制的位置的末尾,然后再次按 Enter。然后将文本复制到剪贴板。
需要注意的一件事是,这也是 Screen 的滚动机制。如果您需要查看屏幕外的某些文本,可以按 Ctrl-a [
,然后向上滚动到屏幕外。
我们可以粘贴使用 Ctrl-a ]
复制的文本。
您可能想要做的另一件事是监视在另一个屏幕窗口中执行的程序。
假设您正在一个窗口中编译某些东西,并且您想知道它何时完成。您可以使用 Ctrl-a _
要求 screen
监视该窗口的静默状态,这将在 30 秒内没有生成任何输出时告诉您。
让我们用另一个例子来试试。让 screen
告诉我们窗口何时完成对 Google 的 ping 4 次。
- ping –c 4 www.google.com
然后输入Ctrl-a _
:
OutputThe window is now being monitored for 30 sec. Silence.
现在我们可以在另一个窗口中工作,并在该窗口中的任务完成时通过输入 Ctrl-a 1
收到警报:
OutputWindow 2: silence for 30 seconds
我们也可以做相反的事情,并在特定窗口上发生活动时收到警报。
- sleep 20 && echo “output”
然后,输入 Ctrl-a M
。
OutputWindow 2 (bash) is now being monitored for all activity.
当命令产生输出时,我们现在会收到警报。要查看结果,请使用 Ctrl-a 1
:
OutputActivity in window 2
假设我们将要进行一些重要的更改,并且我们希望记录我们运行的所有命令。我们可以使用 Ctrl-a H
记录会话。
OutputCreating logfile "screenlog.1".
屏幕区域
如果我们需要一次看到多个窗口,我们可以使用屏幕调用“区域”的东西。我们通过分割当前区域来创建更多区域。要水平分割当前区域,我们可以使用 Ctrl-a S
。
这会将我们当前的窗口移动到屏幕的上半部分,并在其下方打开一个新的空白区域。我们可以使用 Ctrl-a 1
进入下方屏幕。
然后我们可以在底部区域创建一个新窗口,或者以正常方式将视图更改为不同的窗口。
如果我们想杀死当前区域,我们可以使用 Ctrl-a X
。
这会在不破坏实际窗口的情况下破坏该区域。这意味着如果您在该区域运行程序,您仍然可以像普通窗口一样访问它,该窗口的视图被破坏了。
如果我们想进行垂直分割,我们可以使用 Ctrl-a |
代替。
垂直分割的控件与水平分割相同。如果我们添加了几个不同的区域并想返回到一个区域,我们可以使用 Ctrl-a Q
,它会销毁除当前区域之外的所有区域。
第 5 步 – 在屏幕上使用 Byobu
screen
的一个重要改进是名为 byobu
的程序。它充当 screen
的包装器并提供增强的用户体验。在 Ubuntu 上,您可以使用以下命令安装它:
- sudo apt install byobu
在开始之前,我们需要告诉 byobu
使用 screen
作为后端。我们可以使用以下命令执行此操作:
- byobu-select-backend
OutputSelect the byobu backend:
1. tmux
2. screen
Choose 1-2 [1]:
我们可以在这里选择screen
,将其设置为默认的终端管理器。
现在,您可以键入 byobu
而不是键入 screen
来启动会话。
- byobu
当您第一次键入 Ctrl-a
时,您必须告诉 byobu 将其识别为屏幕命令。
OutputConfigure 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
:
- byobu –S sessionname
将 sessionname
更改为您想要的新会话名称。您可以使用以下命令查看当前会话列表:
- byobu –ls
OutputThere 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
OutputByobu 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
OutputThe Byobu window manager will be launched automatically at each text login.
To disable this behavior later, just run:
byobu-disable
Press <enter> to continue…
正如它所说,如果您想再次关闭此功能,请键入:
- byobu-disable
它将不再自动启动。
结论
在本教程中,您安装并使用了 screen
和 byobu
来管理终端会话。您学习了几种不同的快捷方式,用于在多个运行环境之间动态分离和切换。与许多成熟的 Unix 终端界面一样,Screen 可能很特别,但它也很强大且无处不在——你永远不知道它什么时候会派上用场。