简介
Screen是一个控制台应用程序,允许你在一个窗口中使用多个终端会话。该程序在一个shell会话中运行,并作为其他终端会话的容器和管理器,类似于窗口管理器管理窗口的方式。
在很多情况下,创建几个终端窗口是不可能的,也是不理想的。你可能需要在没有X服务器运行的情况下管理多个控制台会话,你可能需要访问许多远程云服务器,或者你可能需要在处理其他任务时监控一个正在运行的程序的输出。
对于这个问题,有一些现代的、多合一的解决方案,比如tmux,但screen 是其中最成熟的,它有自己强大的语法和功能。
第1步 - 安装屏幕
在本教程中,我们将使用Ubuntu 22.04,但在安装过程之外,每个现代Linux发行版上的一切都应该是一样的。
屏幕通常在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.]
在启动程序时,你会看到许可页面。只要按回车键就可以继续。
接下来发生的事情可能会让人吃惊。我们得到了一个正常的命令提示符,看起来好像什么都没有发生。难道是screen 未能正确运行? 让我们试试一个快速的键盘快捷键来了解一下。按Ctrl+a ,然后按v 。
Output
screen 4.09.00 (GNU) 30-Jan-22
我们刚刚向screen索取了版本信息,我们也收到了一些反馈,可以验证screen的运行是否正确。
现在是介绍我们将控制screen 的方式的好时机。屏幕主要是通过键盘快捷键控制的。screen 的每个键盘快捷键都以Ctrl-a 为前导(按住控制键的同时按 "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
Output
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 ,这是Screen的窗口管理工具之一。输入Ctrl-a c Ctrl-a c Ctrl-a c Ctrl-a w 。
Output
0$ bash 1$ bash 2-$ bash 3*$ bash
我们从这个命令中得到一些有用的信息:我们当前窗口的列表。这里,我们有四个窗口。每个窗口都有一个编号,窗口的编号从 "0 "开始。当前窗口的数字旁边有一个星号。
所以你可以看到,我们目前在3号窗口(实际上是第四个窗口,因为第一个窗口是0)。你可以通过使用Ctrl-a 1 ,快速返回到窗口#1。
我们可以使用索引号来直接跳到我们想要的窗口。让我们再看看我们的窗口列表,使用Ctrl-a w 。
Output
0$ bash 1*$ bash 2$ bash 3-$ bash
正如你所看到的,星号告诉我们,我们现在是在1号窗口。让我们尝试用不同的方式来切换窗口,Ctrl-a “ 。
Output
Num Name Flags
0 bash $
1 bash $
2 bash $
3 bash $
这次我们得到了一个实际的导航菜单。你可以用向上和向下的箭头进行导航。通过按回车键切换到一个窗口。
这相当有用,但现在我们所有的窗口都被命名为 "bash"。这不是很有帮助。让我们给我们的一些会话命名。切换到一个你想命名的窗口,例如用Ctrl-a 0 ,然后用Ctrl-a A 。
Output
Set window's title to: bash
使用Ctrl-a A 序列,我们可以给我们的会话命名。现在你可以在 "bash "上退格,然后重命名你想要的东西。我们要在窗口#0上再次运行top ,所以我们要把它命名为monitoring 。
用Ctrl-a “ 来验证这个结果。
Output
Num Name Flags
0 monitoring $
1 bash $
2 bash $
3 bash $
现在我们有了一个对窗口#0更有用的标签。所以我们知道如何创建和命名窗口,但当我们不再需要它们时,我们如何摆脱它们呢? 我们使用Ctrl-a k 序列,它代表 "杀死"。
Output
Really kill this window [y/n]
第3步 - 管理屏幕会话
当你想退出screen 并杀死所有的窗口时,你可以使用Ctrl-a \ 。
Output
Really quit and kill all your windows [y/n]
这将破坏我们的屏幕会话。我们将失去任何我们已经创建的窗口和任何未完成的工作。
但我们想探索一下使用 "屏幕 "的巨大好处之一。我们不想破坏会话,我们想把它分离出来。分离允许我们在screen实例中的程序继续运行,但它使我们能够回到我们的基础控制台会话(我们最初从那里开始 "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
Output
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
第4步 - 在屏幕内管理终端
有一些命令可以帮助你管理你在screen 内运行的终端会话。
要复制文本,你可以使用Ctrl-a [ 。
这将给你一个光标,你可以用方向键或用HJKL移动。移动到你想开始复制的地方,然后按回车键。 移动到你想复制的地方的末尾,再按回车键。文本就会被复制到你的剪贴板上。
需要注意的一点是,这也是屏幕的滚动机制。如果你需要看到屏幕外的一些文本,你可以点击Ctrl-a [ ,然后从屏幕上滚动起来。
我们可以用Ctrl-a ] 粘贴我们复制的文本。
你可能想做的另一件事是监控正在另一个屏幕窗口中执行的程序。
比方说,你正在一个窗口中编译一些东西,你想知道它何时完成。你可以要求screen ,用Ctrl-a _ 来监视那个窗口的静默,当30秒内没有输出时,它就会告诉你。
让我们用另一个例子试试。让我们让screen 告诉我们,当我们的窗口完成了对Google的4次ping。
ping –c 4 www.google.com
然后输入Ctrl-a _ 。
Output
The window is now being monitored for 30 sec. Silence.
现在我们可以在另一个窗口做工作,当这个窗口的任务完成时,输入Ctrl-a 1 ,就可以得到提醒。
Output
Window 2: silence for 30 seconds
我们也可以反其道而行之,当一个特定的窗口有活动发生时,我们就会得到提醒。
sleep 20 && echo “output”
然后,输入Ctrl-a M 。
Output
Window 2 (bash) is now being monitored for all activity.
现在,当该命令产生输出时,我们将得到提醒。要看到结果,请使用Ctrl-a 1 。
OutputActivity in window 2
假设我们要做一些重要的改变,我们想有一个我们运行的所有命令的日志。我们可以用Ctrl-a H 来记录这个会话。
Output
Creating logfile "screenlog.1".
屏幕区域
如果我们需要同时看到多个窗口,我们可以使用屏幕称之为 "区域 "的东西。我们通过分割当前的区域来创建更多的区域。要水平地分割当前区域,我们可以使用Ctrl-a S 。
这将把我们当前的窗口移到屏幕的上半部分,并在它下面打开一个新的空白区域。我们可以用Ctrl-a [tab] 。
然后我们可以在底部区域创建一个新的窗口,或者以正常的方式将视图改变为不同的窗口。
如果我们想杀死当前区域,我们可以使用Ctrl-a X 。
这可以在不破坏实际窗口的情况下破坏该区域。这意味着,如果你在该区域内运行一个程序,你仍然可以作为一个正常的窗口访问它,进入该窗口的视图被破坏了。
如果我们想做一个垂直分割,我们可以使用Ctrl-a | 。
垂直分割的控制与水平分割相同。如果我们已经添加了几个不同的区域,并想回到一个单一的区域,我们可以使用Ctrl-a Q ,这将破坏除当前区域之外的所有区域。
第5步 - 使用Byobu与屏幕
screen 的一个很好的改进是一个叫做byobu 的程序。它作为screen 的一个包装,提供了一个增强的用户体验。在Ubuntu上,你可以用安装它。
sudo apt install byobu
在我们开始之前,我们需要告诉byobu 使用screen 作为后端。我们可以用下面的命令来做这件事。
byobu-select-backend
Output
Select the byobu backend:
1. tmux
2. screen
Choose 1-2 [1]:
我们可以在这里选择screen ,将其设置为默认的终端管理器。
现在,你可以输入byobu ,而不是输入screen 来启动会话。
byobu
当你第一次输入Ctrl-a ,你必须告诉byobu将其识别为一个屏幕命令。
Output
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
Output
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
Output
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
Output
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可能是特立独行的,但它也是强大的和无处不在的--你永远不知道它什么时候会派上用场。