15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
09.10.2024

Использование 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 Screentmux
Доступность по умолчаниюПредустановлен в большинстве дистрибутивовТребует явной установки
Файл конфигурации`.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, он получает исправления безопасности и ошибок, что делает его надёжным для использования в производственной серверной инфраструктуре с длительным сроком эксплуатации.

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать