Использование GNU Screen для подключения и отключения консольных сессий
GNU Screen — это терминальный мультиплексор, который позволяет создавать, управлять и возобновлять несколько независимых сессий оболочки из одного терминального подключения. Когда вы отсоединяетесь от сессии Screen, все запущенные в ней процессы продолжают выполняться в фоновом режиме — переживая разрывы SSH-соединений, сетевые сбои и закрытие терминала — до тех пор, пока вы явно не переподключитесь или не завершите сессию.
Эта возможность незаменима для системных администраторов, управляющих удалёнными серверами через SSH. Независимо от того, компилируете ли вы большую кодовую базу, выполняете миграцию базы данных, мониторите логи или запускаете многочасовое резервное копирование, Screen гарантирует продолжение работы вне зависимости от состояния клиентского соединения.
Почему GNU Screen по-прежнему важен в современной инфраструктуре
Такие инструменты, как `tmux`, набирают популярность, однако GNU Screen остаётся повсеместно распространённым в корпоративных Linux-средах, встраиваемых системах и устаревшей инфраструктуре. Он поставляется как стандартный или почти стандартный пакет в большинстве серверных дистрибутивов, не требует никакой настройки для немедленного использования, а его модель сохранения сессий отличается высокой надёжностью. На VPS или выделенном сервере, где критически важны время безотказной работы и непрерывное выполнение задач, Screen зачастую является самым быстрым способом получить надёжную постоянную сессию.
Ключевые операционные преимущества:
- Сохранение сессии при разрывах соединения — процессы переживают таймауты SSH и сетевые прерывания
- Мультиплексирование окон — выполнение параллельных задач в рамках одного SSH-соединения
- Низкое потребление ресурсов — незначительная нагрузка на CPU и память по сравнению с графическими альтернативами
- Управление сессиями через скрипты — автоматизация создания сессий и внедрения команд с помощью shell-скриптов
- Широкая совместимость — доступен практически на любой POSIX-совместимой системе
GNU Screen vs. tmux: выбор подходящего мультиплексора
Оба инструмента решают одну и ту же основную задачу, но существенно различаются по архитектуре, глубине настройки и удобству написания скриптов.
| Функция | GNU Screen | tmux |
|---|
| — | — | — |
|---|
| Доступность по умолчанию | Предустановлен в большинстве дистрибутивов | Требует явной установки |
|---|
| Файл конфигурации | `.screenrc` | `.tmux.conf` |
|---|
| Разделение панелей | Вертикальное и горизонтальное (ограниченно) | Полное разделение панелей с макетами |
|---|
| Скриптинг / автоматизация | Внедрение команд через `screen -X` | `tmux send-keys`, богатый API |
|---|
| Настройка строки состояния | Базовая | Широкие возможности настройки |
|---|
| Режим копирования | Vi-подобный, менее интуитивный | Режимы Vi и Emacs, интеграция с буфером обмена |
|---|
| Совместное использование сессий | Поддерживается через флаг `-x` | Поддерживается нативно |
|---|
| Порог вхождения | Низкий | Средний |
|---|
| Идеальный сценарий использования | Быстрые постоянные сессии, устаревшие системы | Сложные многопанельные рабочие процессы |
|---|
Для простого сохранения сессий на удалённом сервере — наиболее распространённого сценария системного администрирования — простота Screen является преимуществом, а не ограничением.
Установка GNU Screen
Прежде чем продолжить, убедитесь, что Screen уже установлен:
“`bash
screen –version
“`
Если он не установлен, воспользуйтесь подходящим менеджером пакетов для вашего дистрибутива.
Debian / Ubuntu:
“`bash
sudo apt-get update && sudo apt-get install screen
“`
CentOS / RHEL 7 и более ранние версии:
“`bash
sudo yum install screen
“`
CentOS Stream / RHEL 8+ / Fedora:
“`bash
sudo dnf install screen
“`
Arch Linux:
“`bash
sudo pacman -S screen
“`
macOS (через Homebrew):
“`bash
brew install screen
“`
Проверка:
“`bash
screen –version
Output example: Screen version 4.09.00 (GNU) 30-Jan-22
“`
Запуск сессии Screen
Базовый запуск сессии
“`bash
screen
“`
Это открывает новую сессию Screen со стандартным приглашением оболочки. Сессии автоматически присваивается числовой идентификатор на основе PID.
Именованные сессии (настоятельно рекомендуется)
Всегда давайте имена сессиям в производственных средах. Именованные сессии значительно проще идентифицировать и к ним легче переподключиться, когда одновременно выполняется несколько задач:
“`bash
screen -S session_name
“`
Практические примеры:
“`bash
screen -S db_migration
screen -S log_monitor
screen -S build_job
“`
Именование особенно ценно при управлении несколькими рабочими нагрузками на выделенном сервере, где одновременно могут работать несколько администраторов.
Запуск сессии с командой
Вы можете запустить Screen и сразу выполнить в нём команду:
“`bash
screen -S backup_job bash -c 'rsync -avz /data/ /backup/ && echo "Done"'
“`
Сессия сохраняется даже после завершения команды, что позволяет переподключиться и просмотреть вывод.
Отсоединение от сессии Screen
Отсоединение — это основной рабочий процесс, который делает Screen ценным инструментом. Оно приостанавливает отображение сессии, оставляя всё внутри неё работающим.
Сочетание клавиш:
“`
Ctrl + A, then D
“`
- `Ctrl + A` — префикс команд Screen (все команды Screen начинаются с него)
- `D` — отсоединение
После отсоединения терминал возвращается к исходному приглашению оболочки. Сессия Screen и все процессы внутри неё продолжают работать в фоновом режиме. Вы увидите подтверждающее сообщение:
“`
[detached from 12345.db_migration]
“`
Важное предупреждение: Не путайте отсоединение (`Ctrl+A, D`) с закрытием окна (`Ctrl+A, K` завершает текущее окно). Закрытие всех окон полностью завершает сессию.
Просмотр активных сессий Screen
“`bash
screen -ls
“`
Пример вывода:
“`
There are screens on:
18423.db_migration (Detached)
18891.log_monitor (Attached)
19204.build_job (Detached)
3 Sockets in /var/run/screen/S-root.
“`
Индикаторы состояния имеют следующее значение:
- Detached — к сессии в данный момент не подключён ни один терминал; сессия работает в фоновом режиме
- Attached — к этой сессии активно подключён терминал
- Dead — процесс сессии завершился, но файл сокета не был удалён (используйте `screen -wipe` для удаления мёртвых сессий)
Переподключение к сессии Screen
Переподключение по имени сессии
“`bash
screen -r db_migration
“`
Переподключение по PID сессии
“`bash
screen -r 18423
“`
Переподключение при наличии единственной сессии
“`bash
screen -r
“`
Screen выполнит переподключение автоматически, если присутствует только одна отсоединённая сессия.
Принудительное переподключение к уже подключённой сессии
Это ситуация, которая застаёт многих администраторов врасплох. Если SSH-соединение прервалось некорректно, сессия может по-прежнему отображаться как Attached, поскольку предыдущий терминал не выполнил чистое отсоединение. Попытка стандартного `screen -r` завершится ошибкой:
“`
There is a screen on: 18891.log_monitor (Attached)
There is no screen to be resumed.
“`
Решение — принудительно отсоединить старый терминал и немедленно переподключиться:
“`bash
screen -d -r log_monitor
“`
- `-d` — удалённо отсоединяет сессию от любого терминала, который в данный момент её удерживает
- `-r` — переподключает к текущему терминалу
Альтернатива с явным указанием ID сессии:
“`bash
screen -d -r 18891
“`
Это одна из наиболее важных с операционной точки зрения команд Screen, которая часто требуется после неожиданных разрывов соединения с VPS.
Управление несколькими окнами внутри сессии
Одна из наиболее мощных возможностей Screen — это возможность запускать несколько независимых окон (виртуальных терминалов) в рамках одной сессии. Каждое окно имеет собственную оболочку, дерево процессов и буфер прокрутки.
Создание нового окна
“`
Ctrl + A, then C
“`
Навигация между окнами
| Действие | Сочетание клавиш |
|---|
| — | — |
|---|
| Следующее окно | `Ctrl + A, N` |
|---|
| Предыдущее окно | `Ctrl + A, P` |
|---|
| Перейти к окну по номеру | `Ctrl + A, [0-9]` |
|---|
| Интерактивный список окон | `Ctrl + A, "` |
|---|
| Последнее активное окно | `Ctrl + A, Ctrl + A` |
|---|
Переименование окна
“`
Ctrl + A, then A
“`
Вам будет предложено ввести имя для текущего окна. Именованные окна отображаются в списке окон и строке состояния, что значительно упрощает навигацию при выполнении пяти и более параллельных задач.
Закрытие окна
Введите `exit` в оболочке или нажмите `Ctrl + D`. Когда закрывается последнее окно в сессии, сама сессия Screen завершается.
Для принудительного закрытия текущего окна без выхода из оболочки:
“`
Ctrl + A, then K
“`
Разделение экрана (регионы)
GNU Screen поддерживает базовое разделение терминала, которое менее гибко, чем в tmux, но функционально для параллельного мониторинга.
Горизонтальное разделение (верхняя/нижняя часть):
“`
Ctrl + A, then S
“`
Вертикальное разделение (левая/правая часть):
“`
Ctrl + A, then |
“`
Переместить фокус на следующий регион:
“`
Ctrl + A, then Tab
“`
Удалить текущий регион (без закрытия окна):
“`
Ctrl + A, then X
“`
Удалить все регионы, кроме текущего:
“`
Ctrl + A, then Q
“`
После разделения каждый регион изначально пуст. Перейдите к региону с помощью `Tab`, затем откройте в нём окно, используя `Ctrl + A, N` или `Ctrl + A, "`.
Совместное использование сессии Screen несколькими пользователями
Screen поддерживает совместное использование сессий несколькими пользователями, что удобно для совместной отладки или парного администрирования. Для этого требуется, чтобы Screen был установлен с правами setuid.
Включить многопользовательский режим внутри сессии:
“`
Ctrl + A, then :multiuser on
“`
Предоставить доступ другому пользователю:
“`
Ctrl + A, then :acladd username
“`
После этого другой пользователь может подключиться к вашей сессии:
“`bash
screen -x your_username/session_name
“`
Примечание по безопасности: Многопользовательские сессии Screen требуют тщательного контроля доступа. Предоставляйте права `acladd` только доверенным учётным записям. В средах общего хостинга эта функция, как правило, ограничена.
Отправка команд в отсоединённую сессию
Одна из недооценённых возможностей Screen — это возможность внедрять команды в работающую сессию без переподключения к ней:
“`bash
screen -S db_migration -X stuff "tail -f /var/log/app.logn"
“`
Команда `-X stuff` отправляет нажатия клавиш в сессию, как если бы они были введены вручную. `n` имитирует нажатие Enter. Это чрезвычайно полезно для скриптов автоматизации, которым необходимо взаимодействовать с работающей сессией Screen.
Настройка Screen с помощью .screenrc
Файл `.screenrc` в вашем домашнем каталоге управляет поведением Screen по умолчанию. Минимальная, но практичная конфигурация:
“`bash
~/.screenrc
Disable the startup message
startup_message off
Set scrollback buffer to 10,000 lines
defscrollback 10000
Enable UTF-8
defutf8 on
Show a status bar at the bottom
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'
Set default shell
shell -$SHELL
“`
Параметр `defscrollback 10000` особенно важен — буфер прокрутки по умолчанию составляет всего 100 строк, чего недостаточно для мониторинга длительно выполняющихся процессов.
Полный справочник команд Screen
| Команда / Сочетание клавиш | Функция |
|---|
| — | — |
|---|
| `screen` | Запустить новую безымянную сессию |
|---|
| `screen -S name` | Запустить именованную сессию |
|---|
| `screen -ls` | Вывести список всех сессий |
|---|
| `screen -r name` | Переподключиться к отсоединённой сессии |
|---|
| `screen -d -r name` | Принудительно отсоединить и переподключиться |
|---|
| `screen -x name` | Подключиться к уже подключённой сессии (совместный просмотр) |
|---|
| `screen -wipe` | Удалить сокеты мёртвых сессий |
|---|
| `Ctrl + A, D` | Отсоединиться от текущей сессии |
|---|
| `Ctrl + A, C` | Создать новое окно |
|---|
| `Ctrl + A, N` | Следующее окно |
|---|
| `Ctrl + A, P` | Предыдущее окно |
|---|
| `Ctrl + A, "` | Интерактивный список окон |
|---|
| `Ctrl + A, A` | Переименовать текущее окно |
|---|
| `Ctrl + A, K` | Закрыть текущее окно |
|---|
| `Ctrl + A, S` | Горизонтальное разделение |
|---|
| `Ctrl + A, | ` | Вертикальное разделение |
|---|
| `Ctrl + A, Tab` | Перейти к следующему региону |
|---|
| `Ctrl + A, Q` | Удалить все регионы, кроме текущего |
|---|
| `Ctrl + A, [` | Войти в режим копирования/прокрутки |
|---|
| `Ctrl + A, ?` | Показать все сочетания клавиш |
|---|
| `Ctrl + A, :quit` | Завершить всю сессию |
|---|
Запись вывода сессии Screen в лог
Screen может записывать всё, что выводится в окне, в файл — это незаменимо для аудита длительно выполняющихся задач:
Включить/выключить запись лога для текущего окна:
“`
Ctrl + A, then H
“`
При этом в текущем каталоге создаётся файл `screenlog.N` (где N — номер окна). Также можно включить запись лога из командной строки при запуске сессии:
“`bash
screen -L -S monitored_job
“`
Или указать пользовательский файл лога в `.screenrc`:
“`bash
logfile /var/log/screen/session_%t_%Y%m%d.log
“`
Практические сценарии использования на удалённых серверах
Длительные миграции баз данных: Запустите миграцию внутри именованной сессии Screen, отсоединитесь и периодически переподключайтесь для контроля прогресса. Если SSH-соединение прервётся, миграция продолжится без перебоев.
Непрерывный мониторинг логов: Запустите `tail -f` или `multitail` в окне Screen. Отсоединяйтесь и переподключайтесь всякий раз, когда нужно проверить текущее состояние.
Задачи компиляции: Компиляция крупных проектов на C++ или ядра может занимать часы. Screen гарантирует завершение сборки даже при потере соединения на ноутбуке.
Интерактивные процессы, которые нельзя перевести в фоновый режим: Некоторые инструменты — CLI баз данных, интерактивные сессии Python, текстовые установщики — нельзя просто отправить в фоновый режим с помощью `&`. Screen аккуратно оборачивает их в постоянную сессию.
Координация нескольких администраторов: С помощью `screen -x` два администратора могут одновременно наблюдать за одной сессией, что удобно при реагировании на инциденты на выделенном сервере.
Если вы управляете веб-инфраструктурой совместно с постоянными сессиями, сочетание Screen с хорошо настроенным VPS с cPanel даёт вам как графический интерфейс управления, так и полноценные возможности терминального мультиплексора. Для команд, управляющих обновлением SSL и развёртыванием сертификатов через командную строку, SSL-сертификаты в сочетании со скриптами автоматизации на основе Screen позволяют сделать этот процесс полностью автономным.
Распространённые ошибки и способы их избежать
Накопление осиротевших сессий: Администраторы нередко забывают завершать сессии после выполнения задач. Регулярно запускайте `screen -ls` и используйте `screen -wipe` для очистки мёртвых сокетов. Завершайте неактивные сессии с помощью `screen -S session_name -X quit`.
Слишком маленький буфер прокрутки: Буфер по умолчанию в 100 строк означает, что история вывода быстро теряется. Всегда устанавливайте `defscrollback 10000` или выше в `.screenrc`.
Вложенные сессии Screen: Если вы подключаетесь по SSH из сессии Screen и запускаете другую сессию Screen на удалённом хосте, команды `Ctrl + A` будут перехватываться внешней сессией. Используйте `Ctrl + A, A` для отправки буквального `Ctrl + A` во внутреннюю сессию или `Ctrl + A, :sessionname` для их разграничения.
Сессия остаётся в состоянии Attached после разрыва соединения: Прерванное SSH-соединение может оставить сессию в состоянии Attached. При повторном подключении после неожиданного разрыва всегда используйте `screen -d -r` вместо обычного `screen -r`.
Проблемы с локалью и кодировкой: Если вы видите искажённые символы, убедитесь, что ваш терминал и Screen используют UTF-8. Добавьте `defutf8 on` в `.screenrc` и проверьте, что переменная окружения `LANG` установлена в локаль UTF-8 (например, `en_US.UTF-8`).
Матрица решений: когда использовать Screen
| Сценарий | Использовать Screen? | Примечания |
|---|
| — | — | — |
|---|
| Длительный удалённый процесс | Да | Основной сценарий использования |
|---|
| Разовая SSH-команда | Нет | Накладные расходы не оправданы |
|---|
| Многопанельный рабочий процесс в терминале | Возможно | Рассмотрите tmux для сложных макетов |
|---|
| Совместная сессия отладки | Да | Используйте `-x` для совместного просмотра |
|---|
| Автоматизированный скрипт без взаимодействия | Нет | Используйте `nohup` или службу `systemd` |
|---|
| Интерактивный процесс, который нельзя демонизировать | Да | Screen идеально подходит |
|---|
| Постоянная панель мониторинга | Да | Используйте совместно с именованными окнами и записью логов |
|---|
Технический чеклист ключевых выводов
- Всегда давайте сессиям имена с помощью `screen -S descriptive_name` — безымянные сессии становятся неуправляемыми при масштабировании
- Задайте `defscrollback 10000` в `.screenrc` заблаговременно, а не после потери вывода
- Используйте `screen -d -r` как команду переподключения по умолчанию — она обрабатывает оба состояния: Attached и Detached
- Включайте запись сессии с помощью `screen -L` для любой задачи, вывод которой может потребоваться для аудита
- Регулярно запускайте `screen -wipe` для удаления сокетов мёртвых сессий и поддержания читаемости вывода `screen -ls`
- Внедряйте команды в отсоединённые сессии с помощью `screen -X stuff` для автоматизации взаимодействия без переподключения
- В многоадминистраторских средах настраивайте `.screenrc` с `multiuser on` и явными ACL вместо использования общего root-доступа
- Тестируйте конфигурацию `.screenrc` на непроизводственной системе перед развёртыванием на критической инфраструктуре
Часто задаваемые вопросы
Что происходит с сессией Screen при перезагрузке сервера?
Все сессии Screen теряются при перезагрузке. Сессии Screen — это процессы, работающие в памяти, они не переживают перезапуск системы. Для действительно постоянных служб используйте юнит-файлы `systemd` или init-скрипты. Screen предназначен для сохранения интерактивных сессий при разрывах соединения, а не при перезагрузках.
Можно ли использовать Screen на аккаунте общего хостинга?
Стандартные среды общего веб-хостинга обычно ограничивают SSH-доступ и могут не иметь установленного или доступного Screen. Screen наиболее эффективен в средах VPS или выделенных серверов, где у вас есть полный доступ к оболочке и права root или sudo.
В чём разница между `screen -r` и `screen -x`?
`screen -r` переподключается к отсоединённой сессии, предоставляя вам эксклюзивный доступ. `screen -x` подключается к сессии, которая уже подключена, создавая совместный просмотр, при котором несколько терминалов видят одну и ту же сессию одновременно — это полезно для совместного устранения неполадок.
Как прокрутить вывод в сессии Screen, чтобы увидеть предыдущий вывод?
Войдите в режим копирования/прокрутки с помощью `Ctrl + A, [`. Используйте клавиши со стрелками или Page Up/Page Down для навигации. Нажмите `Escape` или `Q` для выхода из режима копирования. Убедитесь, что буфер прокрутки достаточно велик, задав `defscrollback` в `.screenrc`.
Активно ли поддерживается GNU Screen?
Да. GNU Screen активно поддерживается в рамках проекта GNU. Версия 4.9.x была выпущена в 2022 году. Хотя он не получает такого быстрого развития функциональности, как tmux, он получает исправления безопасности и ошибок, что делает его надёжным для использования в производственной серверной инфраструктуре с длительным сроком эксплуатации.
