> Полный список статей есть в [llms.txt](https://docs.f3cloud.com/llms.txt). Markdown-версия есть у каждой страницы, достаточно добавить .md к её адресу. Эта страница в Markdown: [https://docs.f3cloud.com/ru/linux/screen-linux-tool.md](https://docs.f3cloud.com/ru/linux/screen-linux-tool.md).

# Команда screen в Linux, работа в фоне и горячие клавиши

Как пользоваться Screen в Linux. Установка, сессии, которые продолжают работать после отключения от SSH, несколько окон и разделение экрана, шпаргалка горячих клавиш и решение частых проблем.

**Screen** – это программа, которая держит ваши команды запущенными, даже когда вы отключились от сервера. Обычно, если закрыть окно SSH или пропадёт интернет, всё запущенное в терминале останавливается. Внутри Screen процесс продолжит работать, а вы сможете вернуться к нему позже с любого устройства.

Screen пригодится, когда нужно запустить долгую задачу, например обновление системы, резервное копирование или Telegram-бота, а также чтобы держать несколько терминалов в одном подключении.

***

## Установка

#### Ubuntu и Debian

```bash
# Устанавливаем Screen из стандартного репозитория
apt-get install -y screen
```

#### AlmaLinux, CentOS Stream

```bash
# Screen находится в репозитории EPEL, сначала подключаем его
dnf install -y epel-release

# Устанавливаем Screen
dnf install -y screen
```

Проверить, что всё установилось, можно командой `screen --version`.

***

## Как устроено управление

Внутри Screen все действия выполняются сочетаниями клавиш, и каждое начинается с <kbd>Ctrl</kbd> + <kbd>A</kbd>. Сначала нажмите <kbd>Ctrl</kbd> + <kbd>A</kbd>, отпустите обе клавиши и только потом нажмите нужную букву. Например, «<kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>d</kbd>» отключает от сессии.

> **Регистр букв важен.**
>
> Заглавная и строчная буква дают разные команды. Например, <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>Shift</kbd> + <kbd>S</kbd> делит экран.\
> Строчная <kbd>s</kbd> замораживает вывод в окне.
>
> Если окно перестало реагировать, нажмите <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>q</kbd>. Следите за раскладкой и Caps Lock.

***

## 1. Создайте сессию

Запустите Screen и сразу дайте сессии понятное имя, чтобы потом легко её найти.

```bash
# Создаём сессию с именем backup
screen -S backup
```

Откроется чистый терминал, это уже окно внутри Screen. Запустите в нём нужную команду. В нашем примере это `ping`, который будет работать, пока его не остановят.

<figure><img src="https://docs.f3cloud.com/img/screen-session.png" alt="Команда ping, запущенная внутри сессии Screen"><figcaption><p>Команда работает внутри сессии backup</p></figcaption></figure>

***

## 2. Отключитесь от сессии

Нажмите <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>d</kbd>. Вы вернётесь в обычный терминал и увидите сообщение вида `[detached from 5084.backup]`.

Команда внутри сессии при этом продолжает работать. Теперь можно спокойно закрыть SSH и выключить компьютер.

***

## 3. Посмотрите список сессий

```bash
# Показываем все сессии Screen на сервере
screen -ls
```

<figure><img src="https://docs.f3cloud.com/img/screen-detached.png" alt="Сообщение об отключении и список сессий Screen"><figcaption><p>Отключение от сессии и список сессий</p></figcaption></figure>

В списке видно номер и имя сессии, например `5084.backup`, время её создания и состояние:

* **Detached** – к сессии сейчас никто не подключён, она работает в фоне;
* **Attached** – к сессии кто-то подключён прямо сейчас.

***

## 4. Вернитесь в сессию

```bash
# Подключаемся к сессии backup
screen -r backup
```

Откроется то же окно, где вы остановились, и команда будет работать дальше, как ни в чём не бывало. Если сессия одна, имя можно не указывать, хватит `screen -r`.

Если вы уже подключены к сессии из другого окна, например связь оборвалась и старое подключение «зависло», используйте команду ниже.

```bash
# Отключаем сессию от старого подключения и подключаемся заново
screen -d -r backup
```

А чтобы смотреть в одну сессию сразу из двух мест, например вдвоём с коллегой, подключитесь командой `screen -x backup`.

***

## 5. Работайте с несколькими окнами

В одной сессии можно держать несколько окон и переключаться между ними, как между вкладками.

* <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>c</kbd> – создать новое окно.
* <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>Shift</kbd> + <kbd>A</kbd> – переименовать текущее окно.
* <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>"</kbd> – открыть список окон. Выберите окно стрелками и нажмите <kbd>Enter</kbd>.
* <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>n</kbd> или <kbd>p</kbd> – следующее или предыдущее окно.
* <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем цифра от <kbd>0</kbd> до <kbd>9</kbd> – перейти к окну с этим номером.
* <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>k</kbd> – закрыть текущее окно.

<figure><img src="https://docs.f3cloud.com/img/screen-windows.png" alt="Список окон в сессии Screen"><figcaption><p>Список окон в одной сессии</p></figcaption></figure>

***

## 6. Разделите экран

Screen умеет показывать несколько окон одновременно. Например, слева идёт долгая команда, а справа видна нагрузка на сервер.

1. Нажмите <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>|</kbd>, чтобы разделить экран по вертикали, или <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>Shift</kbd> + <kbd>S</kbd>, чтобы разделить по горизонтали.
2. Перейдите в новую половину сочетанием <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>Tab</kbd>.
3. Новая половина пустая. Откройте в ней окно, нажав <kbd>Ctrl</kbd> + <kbd>A</kbd> и цифру окна, или создайте новое через <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>c</kbd>.

<figure><img src="https://docs.f3cloud.com/img/screen-split.png" alt="Экран Screen, разделённый на две части"><figcaption><p>Слева работает ping, справа top</p></figcaption></figure>

Закрыть текущую половину можно сочетанием <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>Shift</kbd> + <kbd>X</kbd>.\
Оставить только её можно сочетанием <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>Shift</kbd> + <kbd>Q</kbd>.\
 Сами окна при этом не закрываются.

***

## 7. Завершите сессию

Когда задача выполнена, закройте все окна командой `exit`, и сессия завершится сама. Завершить сессию целиком можно и снаружи, не подключаясь к ней.

```bash
# Закрываем сессию backup вместе со всеми её окнами
screen -S backup -X quit
```

***

## Полезные приёмы

### Запуск сразу в фоне

Чтобы запустить команду в Screen и не заходить в сессию, используйте ключи `-dm`. Так удобно запускать ботов и скрипты.

```bash
# Создаём сессию bot и запускаем в ней скрипт, не подключаясь к ней
screen -dmS bot python3 bot.py
```

### Прокрутка вверх

Колёсико мыши внутри Screen обычно не листает историю. Нажмите <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>[</kbd>, и листайте клавишами <kbd>PgUp</kbd> и <kbd>PgDn</kbd> или стрелками. Выйти из режима прокрутки можно клавишей <kbd>Esc</kbd>.

### Запись вывода в файл

Если запустить Screen с ключом `-L`, всё, что появляется в окне, будет сохраняться в файл `screenlog.0` в текущей папке.

***

## Шпаргалка

| Команда | Что делает |
| --- | --- |
| `screen -S имя` | Создать сессию с именем |
| `screen -ls` | Показать все сессии |
| `screen -r имя` | Вернуться в сессию |
| `screen -d -r имя` | Забрать сессию у старого подключения |
| `screen -x имя` | Подключиться к сессии вдвоём |
| `screen -dmS имя команда` | Запустить команду в фоновой сессии |
| `screen -S имя -X quit` | Завершить сессию |
| <kbd>Ctrl</kbd> + <kbd>A</kbd>, <kbd>d</kbd> | Отключиться, не останавливая команды |
| <kbd>Ctrl</kbd> + <kbd>A</kbd>, <kbd>c</kbd> | Новое окно |
| <kbd>Ctrl</kbd> + <kbd>A</kbd>, <kbd>"</kbd> | Список окон |
| <kbd>Ctrl</kbd> + <kbd>A</kbd>, <kbd>n</kbd> / <kbd>p</kbd> | Следующее и предыдущее окно |
| <kbd>Ctrl</kbd> + <kbd>A</kbd>, <kbd>\|</kbd> / <kbd>Shift</kbd> + <kbd>S</kbd> | Разделить экран |
| <kbd>Ctrl</kbd> + <kbd>A</kbd>, <kbd>Tab</kbd> | Перейти в другую часть экрана |
| <kbd>Ctrl</kbd> + <kbd>A</kbd>, <kbd>[</kbd> | Прокрутка истории |
| <kbd>Ctrl</kbd> + <kbd>A</kbd>, <kbd>?</kbd> | Справка по всем сочетаниям |

***

## Частые вопросы

<details>

<summary>Пишет «There is no screen to be resumed matching»</summary>

Сессии с таким именем нет. Проверьте точное имя командой `screen -ls`. Если в списке пусто, сессия уже завершилась, например потому что команда в ней закончила работу или сервер перезагружался.

</details>

<details>

<summary>Сессия в списке есть, но screen -r не подключается</summary>

Если рядом с сессией написано **Attached**, к ней уже подключено другое окно, часто это старое оборвавшееся подключение. Подключитесь командой `screen -d -r имя`, она отключит старое окно и откроет сессию у вас.

</details>

<details>

<summary>Сохранятся ли сессии после перезагрузки сервера?</summary>

Нет. При перезагрузке все сессии Screen и запущенные в них команды останавливаются. Для программ, которые должны работать постоянно и сами запускаться после перезагрузки, лучше настроить службу systemd.

</details>

<details>

<summary>Ctrl + A в командной строке больше не переносит курсор в начало</summary>

Screen перехватывает это сочетание. Чтобы отправить само <kbd>Ctrl</kbd> + <kbd>A</kbd> программе внутри окна, нажмите <kbd>Ctrl</kbd> + <kbd>A</kbd>, затем <kbd>a</kbd>.

</details>

<details>

<summary>Чем Screen отличается от tmux?</summary>

Обе программы решают одну задачу. Screen проще и знаком многим администраторам.\
tmux новее и гибче в настройке.

Для того чтобы команда не останавливалась после отключения от SSH, хватит любой из них.

</details>

***

## Наши ресурсы

**Telegram-канал:** [https://t.me/f3cloud_news](https://t.me/f3cloud_news)\
**Сайт хостинга:** [https://f3cloud.com](https://f3cloud.com/ru)
