如何在Ubuntu云服务器上安装和使用Screen
简介
Screen是一款控制台应用程序,允许您在一个窗口内使用多个终端会话。该程序在一个shell会话中运行,并作为其他终端会话的容器和管理工具,类似于窗口管理器管理窗口。
在许多情况下,无法或不理想地创建多个终端窗口。您可能需要在没有X服务器运行的情况下管理多个控制台会话,您可能需要访问许多远程云服务器,或者您可能需要在处理其他任务时监视运行程序的输出。
有现代化的一体化解决方案来解决这个问题,例如tmux,但是screen是其中最成熟的,并且它有自己强大的语法和功能。
步骤1 – 安装屏幕
在本教程中,我们将使用Ubuntu 22.04,但除了安装过程外,在每个现代Linux发行版上的其他内容应该都是相同的。
屏幕通常在Ubuntu上被默认安装。您也可以使用apt来更新软件源并安装屏幕:
- sudo apt update
- sudo apt install screen
通过运行 which screen 来验证屏幕是否已安装。
- which screen
/usr/bin/screen
在下一步中,你可以开始使用屏幕。
第二步 – 使用屏幕
要启动一个新的屏幕会话,请运行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键继续。
接下来发生的事情可能会让人感到意外。我们得到一个正常的命令提示符,看起来好像什么也没发生。是屏幕运行失败了吗?让我们试试一个快捷键来找出答案。按下Ctrl+a,然后按v键。
screen 4.09.00 (GNU) 30-Jan-22
我们刚刚向屏幕请求了版本信息,收到了一些反馈,可以让我们验证屏幕是否正常运行。
现在是一个介绍我们将如何控制屏幕的绝佳时机。屏幕主要通过键盘快捷键进行控制。每个屏幕的键盘快捷键都以Ctrl-a(按住Ctrl键,然后按下“a”键)为前缀。这个按键序列告诉屏幕它需要注意我们接下来按下的键。
你在我们要求屏幕版本信息时已经使用了这个范例。让我们继续使用它来获取更多有用的信息,输入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上的进程。但是如果我们需要运行一些命令来了解更多关于我们看到的程序的信息怎么办?我们不需要退出“top”。我们可以创建一个新窗口来运行这些命令。
按下 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 w。
0$ bash 1$ bash 2-$ bash 3*$ bash
我们从这个命令中获得了一些有用的信息:我们当前的窗口列表。在这里,我们有四个窗口。每个窗口都有一个数字,窗口的编号从“0”开始。当前的窗口在数字旁边有一个星号。
所以你可以看到我们现在是在第三个窗口(实际上第四个,因为第一个窗口是0)。你可以用 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 $
这次我们得到了一个实际的导航菜单。您可以使用上下箭头进行导航。按下回车键切换到一个窗口。
这个相当有用,但是现在我们所有的窗口都被命名为“bash”。这并不是很有帮助。让我们给一些窗口命名吧。切换到你想要命名的窗口,例如使用Ctrl-a 0,然后使用Ctrl-a A:
Set window’s title to: bash
使用Ctrl-a A序列,我们可以给会话命名。您现在可以使用退格键删除“bash”,然后将其重命名为您想要的名称。我们要在窗口#0再次运行top,因此我们将将其命名为monitoring。
使用 Ctrl-a “:” 验证结果。
Num Name Flags 0 monitoring $ 1 bash $ 2 bash $ 3 bash $
现在对于窗口0,我们有一个更有帮助的标签。所以我们知道如何创建和命名窗口,但是当我们不再需要它们时,我们如何摆脱它们呢?我们使用Ctrl-a k序列,代表”kill”。
Really kill this window [y/n]
步骤三 – 管理屏幕会话。
当您想要退出屏幕并关闭所有窗口时,您可以使用Ctrl-a \。
Really quit and kill all your windows [y/n]
这将会破坏我们的屏幕会话。我们将丢失已创建的窗口和未完成的工作。
但是我们想要探索使用“screen”的巨大好处之一。我们不想销毁会话,我们想要分离它。分离允许我们在“screen”实例中运行程序,同时恢复对基础控制台会话的访问(最初启动“screen”时的会话)。屏幕会话仍然存在,只是在后台进行管理。使用Ctrl-a d进行分离。
[detached from 1835.pts-0.Blank]
那么我们的会话现在已经断开了。我们怎样重新加入呢? de le. ne?)
- screen –r
-r标志代表重新连接。我们现在又回到了屏幕会话中。但是,如果我们有多个屏幕会话怎么办?如果我们开始了一个屏幕会话并将其分离,然后又开始了一个新的屏幕会话并将其分离,会发生什么呢?
尝试运行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
第四步 – 在屏幕中管理终端设备
有许多命令可以帮助您管理在屏幕内运行的终端会话。
要复制文本,你可以使用Ctrl+a进行选择。
这将给你一个可以使用箭头键或者HJKL来移动的光标。移动到你想要开始复制的位置,然后按下Enter键。移动到你想要复制结束的位置,再次按下Enter键。文本将被复制到你的剪贴板上。
需要注意的一件事是,这也是屏幕滚动的机制。如果你需要查看屏幕之外的一些文字,可以按下Ctrl-a [,然后向上滚动屏幕。
我们可以使用Ctrl-a]粘贴我们复制的文本。
你可能还想要做的另一件事是监视正在另一个屏幕窗口中执行的程序。
假设你在一个窗口中正在编译一些东西,而你想知道它何时完成。你可以使用Ctrl-a _让screen监测该窗口是否静止,当输出没有产生30秒时会告诉你。
让我们用另一个例子来试试。让屏幕在我们的窗口完成4次向谷歌发出ping的时候告诉我们。
- 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
我们也可以做相反的操作,当特定窗口有活动时会收到提醒。
- 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。
这将使当前窗口移动到屏幕的上半部,并在下方打开一个新的空白区域。我们可以使用 Ctrl-a [tab] 切换到下方的屏幕。
我们可以选择在底部区域创建一个新窗口,或者以通常的方式切换到不同的窗口。
如果我们想要关闭当前的区域,可以使用Ctrl-a X。
这样可以在不破坏实际窗口的情况下毁掉该区域。也就是说,如果你在该区域运行一个程序,你仍然可以像正常窗口一样访问它,只是对该窗口的视图被破坏了。
如果我们想要进行垂直分割,可以使用Ctrl-a |。
垂直分割的控制方式与水平分割相同。如果我们添加了一些不同的区域,并希望回到单区域状态,我们可以使用 Ctrl-a Q,它会销毁除当前区域外的所有区域。
步骤5 – 使用Byobu与Screen
一个对屏幕的很大增强是一个被称为byobu的程序。它充当屏幕的包装器,提供了增强的用户体验。在Ubuntu上,你可以用以下命令进行安装:
- sudo apt install byobu
在我们开始之前,我们需要告诉byobu使用screen作为后台。我们可以通过以下命令完成:
- byobu-select-backend
Select the byobu backend: 1. tmux 2. screen Choose 1-2 [1]:
我们可以在这里选择屏幕来将其设置为默认的终端管理器。
现在,你可以输入”byobu”来启动会话,而不是输入”screen”。
- byobu
当您首次按下Ctrl-a时,您需要告诉byobu将其识别为屏幕命令。
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。
- byobu –S sessionname
将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 <enter> to continue…
如所述,如果您想要再次关闭此功能,请输入:
- byobu-disable
它将不再自动启动。
结论
在这个教程中,您安装并使用了screen和byobu来管理终端会话。您学习了几种不同的快捷方式来在多个运行环境之间实现快速分离和切换。和许多成熟的Unix终端界面一样,Screen可能有些特殊,但它也非常强大和普遍 – 您永远不知道何时会派上用场。