screen 命令示例：管理多个终端会话
顾名思义，Screen 可以在多个交互式 shell 之间复用物理终端，因此我们可以在每个终端会话中执行不同的任务。所有的 Screen 会话都完全独立地运行程序。
Tmux Screen 复用
顾名思义，Screen 可以在多个交互式 shell 之间复用物理终端，因此我们可以在每个终端会话中执行不同的任务。所有的 Screen 会话都完全独立地运行程序。
![](/data/attachment/album/201906/11/124801th0uy0hti3y211ha.jpg)


GNU Screen 是一个终端多路复用器（窗口管理器）。顾名思义，Screen 可以在多个交互式 shell 之间复用物理终端，因此我们可以在每个终端会话中执行不同的任务。所有的 Screen 会话都完全独立地运行程序。因此，即使会话意外关闭或断开连接，在 Screen 会话内运行的程序或进程也将继续运行。例如，当通过 SSH [升级 Ubuntu](https://www.ostechnix.com/how-to-upgrade-to-ubuntu-18-04-lts-desktop-and-server/) 服务器时，`screen` 命令将继续运行升级过程，以防万一 SSH 会话因任何原因而终止。


GNU Screen 允许我们轻松创建多个 Screen 会话，在不同会话之间切换，在会话之间复制文本，随时连上或脱离会话等等。它是每个 Linux 管理员应该在必要时学习和使用的重要命令行工具之一。在本简要指南中，我们将看到 `screen` 命令的基本用法以及在 Linux 中的示例。


### 安装 GNU Screen


GNU Screen 在大多数 Linux 操作系统的默认存储库中都可用。


要在 Arch Linux 上安装 GNU Screen，请运行：



```
$ sudo pacman -S screen
```

在 Debian、Ubuntu、Linux Mint 上：



```
$ sudo apt-get install screen
```

在 Fedora 上：



```
$ sudo dnf install screen
```

在 RHEL、CentOS 上：



```
$ sudo yum install screen
```

在 SUSE/openSUSE 上：



```
$ sudo zypper install screen
```

让我们继续看一些 `screen` 命令示例。


### 管理多个终端会话的 Screen 命令示例


在 Screen 中所有命令的默认前缀快捷方式是 `Ctrl + a`。使用 Screen 时，你需要经常使用此快捷方式。所以，要记住这个键盘快捷键。


#### 创建新的 Screen 会话


让我们创建一个新的 Screen 会话并连上它。为此，请在终端中键入以下命令：



```
screen
```

现在，在此会话中运行任何程序或进程，即使你与此会话断开连接，正在运行的进程或程序也将继续运行。


#### 从 Screen 会话脱离


要从屏幕会话中脱离，请按 `Ctrl + a` 和 `d`。你无需同时按下两个组合键。首先按 `Ctrl + a` 然后按 `d`。从会话中脱离后，你将看到类似下面的输出。



```
[detached from 29149.pts-0.sk]
```

这里，`29149` 是 Screen ID，`pts-0.sk` 是屏幕会话的名称。你可以使用 Screen ID 或相应的会话名称来连上、脱离和终止屏幕会话。


#### 创建命名会话


你还可以用你选择的任何自定义名称创建一个 Screen 会话，而不是默认用户名，如下所示。



```
screen -S ostechnix
```

上面的命令将创建一个名为 `xxxxx.ostechnix` 的新 Screen 会话，并立即连上它。要从当前会话中脱离，请按 `Ctrl + a`，然后按 `d`。


当你想要查找哪些进程在哪些会话上运行时，命名会话会很有用。例如，当在会话中设置 LAMP 系统时，你可以简单地将其命名为如下所示。



```
screen -S lampstack
```

#### 创建脱离的会话


有时，你可能想要创建一个会话，但不希望自动连上该会话。在这种情况下，运行以下命令来创建名为`senthil` 的已脱离会话：



```
screen -S senthil -d -m
```

也可以缩短为：



```
screen -dmS senthil
```

上面的命令将创建一个名为 `senthil` 的会话，但不会连上它。


#### 列出屏幕会话


要列出所有正在运行的会话（连上的或脱离的），请运行：



```
screen -ls
```

示例输出：



```
There are screens on:
    29700.senthil   (Detached)
    29415.ostechnix (Detached)
    29149.pts-0.sk  (Detached)
3 Sockets in /run/screens/S-sk.
```

如你所见，我有三个正在运行的会话，并且所有会话都已脱离。


#### 连上 Screen 会话


如果你想连上会话，例如 `29415.ostechnix`，只需运行：



```
screen -r 29415.ostechnix
```

或：



```
screen -r ostechnix
```

或使用 Screen ID：



```
screen -r 29415
```

要验证我们是否连上到上述会话，只需列出打开的会话并检查。



```
screen -ls
```

示例输出：



```
There are screens on:
        29700.senthil   (Detached)
        29415.ostechnix (Attached)
        29149.pts-0.sk  (Detached)
3 Sockets in /run/screens/S-sk.
```

如你所见，在上面的输出中，我们目前已连上到 `29415.ostechnix` 会话。要退出当前会话，请按 `ctrl + a d`。


#### 创建嵌套会话


当我们运行 `screen` 命令时，它将为我们创建一个会话。但是，我们可以创建嵌套会话（会话内的会话）。


首先，创建一个新会话或连上已打开的会话。然后我将创建一个名为 `nested` 的新会话。



```
screen -S nested
```

现在，在会话中按 `Ctrl + a` 和 `c` 创建另一个会话。只需重复此操作即可创建任意数量的嵌套 Screen 会话。每个会话都将分配一个号码。号码将从 `0` 开始。


你可以按 `Ctrl + n` 移动到下一个会话，然后按 `Ctrl + p` 移动到上一个会话。


以下是管理嵌套会话的重要键盘快捷键列表。


* `Ctrl + a "` - 列出所有会话
* `Ctrl + a 0` - 切换到会话号 0
* `Ctrl + a n` - 切换到下一个会话
* `Ctrl + a p` - 切换到上一个会话
* `Ctrl + a S` - 将当前区域水平分割为两个区域
* `Ctrl + a l` - 将当前区域垂直分割为两个区域
* `Ctrl + a Q` - 关闭除当前会话之外的所有会话
* `Ctrl + a X` - 关闭当前会话
* `Ctrl + a \` - 终止所有会话并终止 Screen
* `Ctrl + a ?` - 显示键绑定。要退出，请按回车 #### 锁定会话


Screen 有一个锁定会话的选项。为此，请按 `Ctrl + a` 和 `x`。 输入你的 Linux 密码以锁定。



```
Screen used by sk <sk> on ubuntuserver.
Password:
```

#### 记录会话


你可能希望记录 Screen 会话中的所有内容。为此，只需按 `Ctrl + a` 和 `H` 即可。


或者，你也可以使用 `-L` 参数启动新会话来启用日志记录。



```
screen -L
```

从现在开始，你在会话中做的所有活动都将记录并存储在 `$HOME` 目录中名为 `screenlog.x` 的文件中。这里，`x` 是一个数字。


你可以使用 `cat` 命令或任何文本查看器查看日志文件的内容。


![](/data/attachment/album/201906/11/124855umbptett8t7e7zqm.png)


*记录 Screen 会话*


#### 终止 Screen 会话


如果不再需要会话，只需杀死它。要杀死名为 `senthil` 的脱离会话：



```
screen -r senthil -X quit
```

或：



```
screen -X -S senthil quit
```

或：



```
screen -X -S 29415 quit
```

如果没有打开的会话，你将看到以下输出：



```
$ screen -ls
No Sockets found in /run/screens/S-sk.
```

更多细节请参照 man 手册页：



```
$ man screen
```

还有一个名为 Tmux 的类似的命令行实用程序，它与 GNU Screen 执行相同的工作。要了解更多信息，请参阅以下指南。


* [Tmux 命令示例：管理多个终端会话](https://www.ostechnix.com/tmux-command-examples-to-manage-multiple-terminal-sessions/)


### 资源


* [GNU Screen 主页](https://www.gnu.org/software/screen/)




---


via: <https://www.ostechnix.com/screen-command-examples-to-manage-multiple-terminal-sessions/>


作者：[sk](https://www.ostechnix.com/author/sk/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出

