介绍
Screen 是一个控制台应用程序,允许您在一个窗口中使用多个终端会话,该程序在一个壳会话中运行,并作为其他终端会话的容器和管理器,类似于窗口管理器管理窗口的方式。
有许多情况下,创建多个终端窗口是不可能的或理想的,您可能需要管理多个主机会话而无需运行 X 服务器,您可能需要访问许多远程云服务器,或者您可能需要监控运行程序的输出,同时在其他任务中工作。
对于这个问题,有现代的全在一的解决方案,如 tmux,但屏幕
是其中最成熟的,它有自己的强大的语法和功能。
步骤一:安装屏幕
在本教程中,我们将使用Ubuntu 22.04,但在安装过程中,所有现代Linux发行版都应该是相同的。
屏幕通常在Ubuntu上默认安装,您也可以使用apt
来更新您的包源并安装screen
:
1sudo apt update
2sudo apt install screen
通过运行哪个屏幕
来验证屏幕
是否已安装:
1which screen
1[secondary_label Output]
2/usr/bin/screen
您可以在下一步开始使用屏幕
。
步骤二:使用屏幕
要开始新的屏幕会话,运行屏幕
命令。
1screen
1[secondary_label Output
2GNU Screen version 4.09.00 (GNU) 30-Jan-22
3
4Copyright (c) 2018-2020 Alexander Naumov, Amadeusz Slawinski
5Copyright (c) 2015-2017 Juergen Weigert, Alexander Naumov, Amadeusz Slawinski
6Copyright (c) 2010-2014 Juergen Weigert, Sadrul Habib Chowdhury
7Copyright (c) 2008-2009 Juergen Weigert, Michael Schroeder, Micah Cowan, Sadrul Habib
8Chowdhury
9Copyright (c) 1993-2007 Juergen Weigert, Michael Schroeder
10Copyright (c) 1987 Oliver Laumann
11
12This program is free software; you can redistribute it and/or modify it under
13the terms of the GNU General Public License as published by the Free Software
14Foundation; either version 2, or (at your option) any later version.
15…
16 [Press Space for next page; Return to end.]
您将在启动程序时看到许可页面,只需按 Enter 才能继续。
接下来发生的事情可能会令人惊讶. 我们收到一个正常的命令提示,看起来好像什么都没有发生过. 是否屏幕
失败了? 让我们尝试一个快速的键盘快捷键来找出。
1[secondary_label Output]
2screen 4.09.00 (GNU) 30-Jan-22
我们刚刚从屏幕上请求了版本信息,并收到了一些反馈,允许我们验证屏幕 is正确运行。
现在是介绍我们将控制屏幕
的方式的好时机。屏幕主要是通过键盘快捷控制的。为屏幕
的每一个键盘快捷预先表示Ctrl-a
(在按a
键时保持控制键)。
你曾经使用过这个范式,当我们要求关于屏幕
的版本信息时,让我们通过输入Ctrl-a?
来获得一些更有用的信息:
1[secondary_label Output]
2 Screen key bindings, page 1 of 2.
3
4 Command key: ^A Literal ^A: a
5
6 break ^B b license , removebuf =
7 clear C lockscreen ^X x reset Z
8 colon : log H screen ^C c
9 copy ^[ [ login L select '
10 detach ^D d meta a silence _
11 digraph ^V monitor M split S
12 displays * next ^@ ^N sp n suspend ^Z z
13 dumptermcap . number N time ^T t
14 fit F only Q title A
15 flow ^F f other ^A vbell ^G
16 focus ^I pow_break B version v
17 hardcopy h pow_detach D width W
18 help ? prev ^H ^P p ^? windows ^W w
19 history { } quit \ wrap ^R r
20 info i readbuf < writebuf >
21 kill K k redisplay ^L l xoff ^S s
22 lastmsg ^M m remove X xon ^Q q
23
24 [Press Space for next page; Return to end.]
这是内部键盘快捷屏幕. 您可能想记住如何到达这里,因为这是一个很好的快速参考。 正如您可以在底部看到的那样,您可以点击空间以获取更多命令。
让我们在这个窗口中运行一个名为顶部
的程序,这将向我们展示一些关于我们的流程的信息。
1top
1[secondary_label Output]
2top - 16:08:07 up 1:44, 1 user, load average: 0.00, 0.01, 0.05
3Tasks: 58 total, 1 running, 57 sleeping, 0 stopped, 0 zombie
4Cpu(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
5Mem: 507620k total, 262920k used, 244700k free, 8720k buffers
6Swap: 0k total, 0k used, 0k free, 224584k cached
7
8 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9 1 root 20 0 3384 1836 1288 S 0.0 0.4 0:00.70 init
10 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
11 3 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0
12 5 root 20 0 0 0 0 S 0.0 0.0 0:00.12 kworker/u:0
13 6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
14 7 root RT 0 0 0 0 S 0.0 0.0 0:00.07 watchdog/0
15 8 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 cpuset
16 9 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper
17 10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
18 11 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
19 12 root 20 0 0 0 0 S 0.0 0.0 0:00.03 sync_supers
20 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 bdi-default
21 14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
22 15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
23 16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 ata_sff
24 17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khubd
25 18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md
好吧,我们现在正在监控VPS上的流程,但如果我们需要运行一些命令来了解更多关于我们看到的程序的信息?我们不需要离开顶部
。
Ctrl-a c
序列为我们创建了一个新的窗口,我们现在可以运行我们想要的任何命令,而不打扰我们在另一个窗口中进行的监控。
其他窗口去哪儿了?我们可以使用Ctrl-a n
返回它。
这个序列进入我们正在运行的下一个窗口. 窗口列表包裹,所以当没有任何窗口超出当前的窗口时,它将我们转到第一个窗口。
「Ctrl-a p」會以相反的方向改變目前的窗口,因此,如果您有三個窗口,目前正在第三個窗口,這個命令會將您切換到第二個窗口。
当你在同一两个窗口之间翻转时使用的一个有用的捷径是Ctrl-a Ctrl-a
。
此序列将您移动到您最近访问的窗口,所以在上一个示例中,这将使您回到第三个窗口。
在这一点上,你可能会想知道如何跟踪我们正在创建的所有窗口。幸运的是,屏幕提供了一些不同的方式来管理你的不同会话。首先,我们将创建三个新的窗口,共四个窗口,然后我们将尝试Ctrl-a w
,这是屏幕的窗口管理工具之一。输入Ctrl-a c Ctrl-a c Ctrl-a c Ctrl-a c Ctrl-a w
:
1[secondary_label Output]
20$ bash 1$ bash 2-$ bash 3*$ bash
我们从这个命令中获得了一些有用的信息:我们当前的窗口的列表. 在这里,我们有四个窗口. 每个窗口都有一个数字,窗口的编号从0
开始。
所以你可以看到我们目前在窗口# 3(实际上是第四个窗口,因为第一个窗口是0)。
我們可以使用索引號碼直接跳到我們想要的窗口. 讓我們再次使用「Ctrl-a w」查看我們的窗口列表:
1[secondary_label Output]
20$ bash 1*$ bash 2$ bash 3-$ bash
正如你所看到的,星座告诉我们,我们现在在窗口 # 1 上。
1[secondary_label Output]
2Num Name Flags
3
4 0 bash $
5 1 bash $
6 2 bash $
7 3 bash $
这次我们得到一个实际的导航菜单. 您可以使用向上和向下箭头导航. 通过按 Enter 切换到窗口。
这是非常有用的,但现在我们的所有窗口都被命名为bash
。这不是非常有用的。让我们命名一些我们的会话。切换到您想要命名的窗口,例如使用Ctrl-a 0
,然后使用Ctrl-a A
:
1[secondary_label Output]
2Set window's title to: bash
使用Ctrl-a A
序列,我们可以命名我们的会话。你现在可以通过bash
重新命名,然后将其更名为任何你想要的。
点击Ctrl-a “
来验证结果:
1[secondary_label Output]
2Num Name Flags
3
4 0 monitoring $
5 1 bash $
6 2 bash $
7 3 bash $
现在我们有一个更有用的标签为窗口# 0.所以我们知道如何创建和命名窗口,但我们如何摆脱它们,当我们不再需要它们?我们使用Ctrl-a k
序列,这代表杀死
。
1[secondary_label Output]
2Really kill this window [y/n]
步骤三:管理屏幕会话
当你想停止屏幕
并杀死你的所有窗口时,你可以使用Ctrl-a
。
1[secondary_label Output]
2Really quit and kill all your windows [y/n]
这将破坏我们的屏幕会话,我们将失去我们创建的任何窗口和未完成的工作。
但是我们想探索使用屏幕
的巨大好处之一。我们不想破坏会话,我们想要分离它。 分离允许屏幕实例中的我们的程序继续运行,但它使我们能够返回我们的主机会话(我们最初开始的屏幕
会话)。
1[secondary_label Output]
2[detached from 1835.pts-0.Blank]
我們的會議已經分開了,我們該怎麼回去呢?
1screen –r
-r
旗帜代表重新连接,我们现在回到我们的屏幕会话中,如果我们有多个屏幕会话呢?如果我们已经开始一个屏幕会话并分离它,然后开始一个新的屏幕会话并分离了它呢?
尝试运行屏幕
,然后与Ctrl-a d
分离,然后再次运行屏幕
,然后再次与Ctrl-a d
分离。
我们如何告诉屏幕
要附加哪个会话?
1screen –ls
1[secondary_label Output]
2There are screens on:
3 2171.pts-0.Blank (07/01/2013 05:00:39 PM) (Detached)
4 1835.pts-0.Blank (07/01/2013 03:50:43 PM) (Detached)
52 Sockets in /var/run/screen/S-justin.
现在我们有我们的会话列表,我们可以通过在-r
旗帜后输入其ID号重新连接第二个会话。
1screen –r 1835
如果您想在两个单独的计算机或终端窗口上附上会话,您可以使用-x
旗帜,允许您共享会话。
1screen –x
步骤4:在屏幕内管理终端
有几个命令可以帮助您管理您在屏幕
中运行的终端会话。
要复制文本,您可以使用Ctrl-a。
这将为您提供一个方针,您可以使用箭头键或HJKL移动。 移动到您想要开始复制的地方,然后按 Enter。
要注意的是,这也是 Screen 的滚动机制,如果你需要看到屏幕上的一些文本,你可以点击Ctrl-a
,然后滚出屏幕。
我们可以粘贴我们用Ctrl-a
复制的文本。
您可能想做的另一个事情是监控正在运行在另一个屏幕窗口的程序。
假设你在一个窗口中编译一些东西,你想知道它什么时候完成,你可以要求屏幕
用Ctrl-a _
监控该窗口的沉默,这会告诉你30秒内没有生成任何输出。
讓「屏幕」告訴我們,當我們的窗口已經完成打字Google 4 次。
1ping –c 4 www.google.com
然后输入Ctrl-a _
:
1[secondary_label Output]
2The window is now being monitored for 30 sec. Silence.
现在我们可以在另一个窗口工作,并通过输入Ctrl-a 1
来通知这个窗口中的任务完成时:
1[secondary_label Output]
2Window 2: silence for 30 seconds
我们也可以做相反的事情,并在特定窗口发生活动时被警告。
1sleep 20 && echo “output”
然后输入Ctrl-a M
。
1[secondary_label Output]
2Window 2 (bash) is now being monitored for all activity.
当命令产生输出时,我们将被通知. 若要查看结果,请使用Ctrl-a 1
:
1[secondary_label Output]
2Activity in window 2
假设我们正在做一些重要的更改,我们想要记录我们运行的所有命令,我们可以使用Ctrl-a H
来记录会话。
1[secondary_label Output]
2Creating logfile "screenlog.1".
屏幕区域
如果我们需要同时看到多个窗口,我们可以使用屏幕称之为区域
的东西。我们通过分割当前区域来创建更多的区域。
这将将我们当前的窗口移动到屏幕的上半部分,并在其下方打开一个新的空区域,我们可以通过Ctrl-a [tab]
进入下面的屏幕。
然后,我们可以在底部区域创建一个新窗口,或者以正常方式将视图更改为另一个窗口。
如果我们想杀死当前区域,我们可以使用Ctrl-a X
。
这意味着如果您在该区域运行程序,您仍然可以作为正常窗口访问它,该窗口的视图被破坏。
如果我们想做一个垂直的分裂,我们可以使用Ctrl-a̧
代替。
如果我们已经添加了几个不同的区域,并且想回到一个单一的区域,我们可以使用Ctrl-a Q
,这消灭了除当前区域外的所有区域。
步骤 5 – 使用 Byobu 与屏幕
对于屏幕
来说,一个很好的改进是名为byobu
的程序,它作为屏幕
的包装器,并提供增强的用户体验。
1sudo apt install byobu
在我们开始之前,我们需要告诉byobu
使用屏幕
作为后端,我们可以用以下命令做到这一点:
1byobu-select-backend
1[secondary_label Output]
2Select the byobu backend:
3 1. tmux
4 2. screen
5
6Choose 1-2 [1]:
我们可以在这里选择屏幕
,将其设置为默认终端管理器。
现在,而不是键入屏幕
来启动会话,您可以键入byobu
。
1byobu
当你第一次键入Ctrl-a
时,你必须告诉byobu将其识别为屏幕命令。
1[secondary_label Output]
2Configure Byobu's ctrl-a behavior...
3
4When you press ctrl-a in Byobu, do you want it to operate in:
5 (1) Screen mode (GNU Screen's default escape sequence)
6 (2) Emacs mode (go to beginning of line)
7
8Note that:
9 - F12 also operates as an escape in Byobu
10 - You can press F9 and choose your escape character
11 - You can run 'byobu-ctrl-a' at any time to change your selection
12
13Select [1 or 2]:
选择1
以正常使用byobu。
该界面为您提供了大量有用的信息,例如窗口列表和系统信息. 在Ubuntu上,它甚至告诉您有多少包具有安全更新,随后有红色背景上的呼声点。
使用byobu和屏幕之间有一个不同之处是byobu实际上如何管理会话.一旦你分离,如果你再次运行byobu
,它将重新连接你的以前的会话,而不是创建一个新的会话。
要创建一个新的会话,请使用 byobu -S
:
1byobu –S sessionname
将会话名称
更改为您想要称呼的新会话的名称,您可以看到当前会话的列表:
1byobu –ls
1[secondary_label Output]
2There are screens on:
3 22961.new (07/01/2013 06:42:52 PM) (Detached)
4 22281.byobu (07/01/2013 06:37:18 PM) (Detached)
52 Sockets in /var/run/screen/S-root.
如果有多个会话,当你运行byobu
时,你会收到一个菜单来选择你想要连接的会话。
1byobu
1[secondary_label Output]
2Byobu sessions...
3
4 1. screen: 22961.new (07/01/2013 06:42:52 PM) (Detached)
5 2. screen: 22281.byobu (07/01/2013 06:37:18 PM) (Detached)
6 3. Create a new Byobu session (screen)
7 4. Run a shell without Byobu (/bin/bash)
8
9Choose 1-4 [1]:
您可以选择当前的任何会话,创建新的byobu会话,甚至在不使用byobu的情况下获得新的壳。
在您远程管理的云服务器上可能有用的一个选项是,每次您登录会话时,自动启动byobu,这意味着如果您从会话中脱离连接,您的工作不会丢失,您可以重新连接,回到之前的位置。
要允许 byobu 自动启动每个登录,请在终端中输入:
1byobu-enable
1[secondary_label Output]
2The Byobu window manager will be launched automatically at each text login.
3
4To disable this behavior later, just run:
5 byobu-disable
6
7Press <enter> to continue…
正如它所说,如果您想再次关闭此功能,请键入:
1byobu-disable
它将不再自动启动。
结论
在本教程中,你安装并使用屏幕
,然后byobu
来管理终端会话. 你学会了几种不同的捷径,以便在飞行中分离和切换多个运行环境。