15%

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

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

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

Skills
Начать
08.10.2024

Полное руководство по командам GNU Screen в Linux

GNU Screen — это мультиплексор терминала, который позволяет создавать, управлять и сохранять несколько сессий оболочки в одном окне терминала. Когда вы отсоединяетесь от сессии Screen, каждый запущенный в ней процесс продолжает выполняться — переживая разрывы SSH-соединений, сетевые сбои и закрытие терминала — и остаётся полностью доступным в момент повторного подключения.

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

Почему GNU Screen остаётся актуальным в современном администрировании Linux

Такие инструменты, как tmux, приобрели популярность, но Screen поставляется как стандартный или почти стандартный пакет практически в каждом корпоративном дистрибутиве Linux и минимальном образе сервера. Когда вы подключаетесь по SSH к физическому серверу или только что развёрнутому экземпляру VPS Хостинга, Screen почти всегда доступен без какой-либо дополнительной установки. Низкое потребление памяти и соответствие стандарту POSIX делают его прагматичным выбором в ограниченных или закрытых средах.

Основные возможности:

  • Сохранение сессий: Процессы переживают отключение терминала, тайм-аут SSH и сбои на стороне клиента
  • Мультиплексирование окон: Несколько независимых окон оболочки внутри одной сессии
  • Совместное использование сессий: Два пользователя могут одновременно подключиться к одной сессии для совместной отладки
  • Доступ к последовательной консоли: Screen может напрямую подключаться к устройствам `/dev/ttyS*` для внеполосного управления сервером
  • Автоматизированный запуск: Файл конфигурации `.screenrc` позволяет полностью автоматизировать создание многооконных сред при запуске

GNU Screen vs. tmux: выбор подходящего мультиплексора

Оба инструмента решают одну и ту же основную задачу, но с разными философиями проектирования. В таблице ниже представлены различия, которые важны в производственных средах.

ФункцияGNU Screentmux
Доступность по умолчаниюПредустановлен в большинстве дистрибутивовТребует явной установки
Файл конфигурации`~/.screenrc``~/.tmux.conf`
Разделение панелей (горизонтальное/вертикальное)Ограниченное (только вертикальное через регионы)Полное, гибкое разделение панелей
Совместное использование сессийВстроенное многопользовательское подключениеВстроенное многопользовательское подключение
Скриптинг / автоматизацияИнъекция команд `screen -X``tmux send-keys`, богатый API
Потребление памятиОчень низкоеНизкое
Поддержка последовательных устройствДа (`screen /dev/ttyS0`)Нет
Настройка строки состоянияУмеренная (hardstatus)Высокая гибкость
Режим копированияВ стиле viВ стиле vi или emacs
Экосистема плагиновОтсутствуетАктивная (TPM)
Идеальный сценарий использованияМинимальные серверы, последовательные консоли, устаревшие средыРабочие станции разработчиков, сложные макеты

Практические рекомендации: На безголовом Выделенном Сервере, выполняющем долгосрочные фоновые задачи, простота Screen и его повсеместная доступность делают его менее трудоёмким выбором. Для разработчика, которому нужны разделённые панели и богатая строка состояния, предпочтительнее tmux.

Установка 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+ / AlmaLinux / Rocky Linux:

“`bash

sudo dnf install screen

“`

Fedora:

“`bash

sudo dnf install screen

“`

Arch Linux:

“`bash

sudo pacman -S screen

“`

Alpine Linux (распространён в контейнерах):

“`bash

apk add screen

“`

После установки не требуется никакого демона или службы. Screen работает полностью как пользовательский процесс.

Запуск сессии Screen

Базовая сессия

“`bash

screen

“`

Это переводит вас в новую сессию со стандартной оболочкой. Интерфейс неотличим от обычного терминала, пока вы не используете командный префикс Screen.

Именованная сессия (рекомендуется)

“`bash

screen -S session_name

“`

Всегда давайте имена сессиям в производственной среде. Безымянные сессии идентифицируются только по их PID, что делает повторное подключение ненадёжным при наличии нескольких запущенных сессий.

Совет по соглашению об именовании: Используйте описательные имена, отражающие рабочую нагрузку — `screen -S db-migration`, `screen -S log-monitor`, `screen -S build-php82`. Это окупится, когда вы вернётесь к серверу после нескольких часов отсутствия.

Запуск сессии с немедленным выполнением команды

“`bash

screen -S backup-job bash -c 'rsync -avz /data/ user@remote:/backup/ && echo DONE'

“`

Сессия сохраняется даже после завершения команды, позволяя вам просмотреть вывод позже.

Запуск сессии в отсоединённом режиме

“`bash

screen -dmS headless-job ./long_running_script.sh

“`

Флаги `-dm` создают сессию и немедленно отсоединяются от неё. Это правильный шаблон для запуска фоновых задач из cron или скриптов развёртывания — процесс выполняется внутри именованной, восстанавливаемой сессии Screen без необходимости в интерактивном терминале.

Командный префикс: понимание Ctrl+A

Каждое сочетание клавиш Screen начинается с управляющей последовательности `Ctrl+A`. Это нажатие клавиши сообщает Screen, что следующий символ является командой, а не вводом для запущенной программы. Понимание этой модели необходимо перед запоминанием отдельных сочетаний клавиш.

Если вы запускаете программу внутри Screen, которая сама использует `Ctrl+A` (например, некоторые текстовые редакторы или библиотека `readline`), вы можете отправить буквальный `Ctrl+A` внутренней программе, нажав `Ctrl+A` дважды (`Ctrl+A, Ctrl+A`).

Отсоединение и повторное подключение к сессиям

Отсоединение от запущенной сессии

“`

Ctrl+A, D

“`

Сессия продолжает работать в фоновом режиме. Вы возвращаетесь в родительскую оболочку. Ни один процесс внутри сессии не прерывается.

Просмотр всех сессий

“`bash

screen -ls

“`

Пример вывода:

“`

There are screens on:

14231.db-migration (Detached)

14089.log-monitor (Attached)

13901.build-php82 (Detached)

3 Sockets in /var/run/screen/S-deploy.

“`

Статус `Attached` означает, что к этой сессии в данный момент подключён другой терминал. `Detached` означает, что сессия запущена, но к ней не подключён ни один терминал.

Повторное подключение к конкретной сессии

“`bash

screen -r db-migration

“`

Или по PID:

“`bash

screen -r 14231

“`

Принудительное подключение к уже подключённой сессии

Если сессия отображается как `Attached`, но вам нужно её захватить (например, после того как устаревшее SSH-соединение оставило её заблокированной):

“`bash

screen -d -r log-monitor

“`

Флаг `-d` принудительно отсоединяет другое соединение перед повторным подключением вас. Это критически важный метод восстановления, когда предыдущая SSH-сессия завершилась без чистого отсоединения.

Многопользовательское подключение: два пользователя в одной сессии

“`bash

screen -x session_name

“`

Оба терминала видят идентичный вывод в реальном времени. Это бесценно для совместной отладки или совместного обхода сервера с коллегой — обе стороны наблюдают и могут взаимодействовать с одной и той же оболочкой.

Управление окнами внутри сессии

Одна сессия Screen может содержать неограниченное количество окон. Каждое окно является независимой оболочкой (или процессом).

Создание нового окна

“`

Ctrl+A, C

“`

Навигация между окнами

Сочетание клавишДействие
`Ctrl+A, N`Следующее окно
`Ctrl+A, P`Предыдущее окно
`Ctrl+A, 0–9`Перейти непосредственно к окну по номеру
`Ctrl+A, "`Интерактивный список всех окон
`Ctrl+A, '`Запрос на ввод номера или имени окна

Переименование окна

“`

Ctrl+A, A

“`

Введите новое имя и нажмите Enter. Осмысленные имена окон отображаются в строке hardstatus, что значительно ускоряет навигацию в сессиях с большим количеством окон.

Закрытие окна

Введите `exit` или нажмите `Ctrl+D` в оболочке окна. Когда последнее окно в сессии закрывается, сессия завершается.

Разделение экрана на регионы

Screen поддерживает разделение терминала на несколько видимых регионов, каждый из которых одновременно отображает разные окна.

Горизонтальное разделение (верх/низ)

“`

Ctrl+A, S

“`

Вертикальное разделение (лево/право)

“`

Ctrl+A, |

“`

Примечание: Вертикальное разделение требует Screen версии 4.1.0 или выше.

Перемещение между регионами

“`

Ctrl+A, Tab

“`

Назначение окна региону

После перемещения фокуса в регион используйте `Ctrl+A, "` для выбора отображаемого там окна.

Удаление региона

“`

Ctrl+A, X (remove current region)

Ctrl+A, Q (remove all regions except current)

“`

Важное различие: Удаление региона не закрывает работающее в нём окно. Окно продолжает работать; вы просто прекращаете отображать его в этом разделении.

Копирование и вставка (режим прокрутки)

Screen поддерживает буфер прокрутки для каждого окна. Для доступа к нему:

“`

Ctrl+A, [

“`

Это переводит в режим копирования. Навигация осуществляется с помощью клавиш в стиле vi:

  • `h`, `j`, `k`, `l` — перемещение курсора
  • `Ctrl+F` / `Ctrl+B` — страница вперёд / назад
  • `/` — поиск вперёд
  • `?` — поиск назад
  • `Space` — отметить начало выделения
  • `Space` (снова) — отметить конец и скопировать в буфер

Для вставки скопированного текста:

“`

Ctrl+A, ]

“`

Буфер прокрутки по умолчанию составляет 100 строк. Для мониторинга логов сервера значительно увеличьте это значение в `.screenrc` (описано ниже).

Блокировка сессии Screen

“`

Ctrl+A, X

“`

Сессия немедленно блокируется и запрашивает пароль пользователя Unix перед предоставлением доступа. Используйте это при отходе от терминала, подключённого к чувствительному серверу — это быстрее, чем закрытие SSH-соединения и повторное подключение.

Отправка команд в сессию без подключения

Флаг `-X` позволяет вводить команды Screen в запущенную сессию извне:

“`bash

screen -S db-migration -X stuff "tail -f /var/log/mysql/error.logn"

“`

Команда `stuff` отправляет нажатия клавиш в активное окно именованной сессии. `n` имитирует нажатие Enter. Этот метод используется в скриптах автоматизации развёртывания для взаимодействия с долго работающими сессиями Screen без необходимости ручного подключения.

Настройка Screen с помощью .screenrc

Файл `~/.screenrc` читается при запуске и управляет поведением Screen по умолчанию. Хорошо настроенный `.screenrc` превращает Screen из базового мультиплексора в по-настоящему эргономичную среду.

Создайте или отредактируйте его:

“`bash

nano ~/.screenrc

“`

Рекомендуемая конфигурация .screenrc для производственной среды

“`bash

Disable the startup message

startup_message off

Set scrollback buffer to 10,000 lines (critical for log monitoring)

defscrollback 10000

Enable UTF-8

defutf8 on

Set default shell

shell -$SHELL

Visual bell instead of audible

vbell on

Hardstatus bar: shows hostname, window list, and current time

hardstatus on

hardstatus alwayslastline

hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]'

Bind F2 to create a new window

bindkey -k k2 screen

Change escape key to Ctrl+B (useful if Ctrl+A conflicts with other tools)

escape ^Bb

Auto-detach on hangup signal (critical for SSH session drops)

autodetach on

Disable flow control (prevents Ctrl+S from freezing the terminal)

defflow off

“`

Директива `autodetach on` обязательна при использовании SSH. Без неё, если ваше SSH-соединение неожиданно разрывается (а не вы нажимаете `Ctrl+A, D`), Screen может завершить сессию вместо её отсоединения. При наличии `autodetach on` сигнал SIGHUP (отправляемый при отключении SSH) вызывает чистое отсоединение, а не завершение сессии.

`defflow off` предотвращает распространённую проблему случайного нажатия `Ctrl+S` и кажущейся заморозки терминала. Многие администраторы тратят минуты на устранение неполадок «зависшего» терминала, который просто находится в паузе управления потоком XON/XOFF.

Практические сценарии использования в производственной среде

Безопасное выполнение миграции базы данных

“`bash

screen -S db-migrate

Inside the session:

php artisan migrate –force 2>&1 | tee /var/log/migration-$(date +%F).log

Detach: Ctrl+A, D

Reattach later to check progress:

screen -r db-migrate

“`

Если SSH-соединение разрывается в процессе миграции, процесс продолжается. Вы повторно подключаетесь и обнаруживаете, что он либо всё ещё выполняется, либо завершён с полным выводом, сохранённым в логе и буфере прокрутки.

Одновременный мониторинг нескольких файлов логов

“`bash

screen -S monitoring

Window 0: nginx access log

tail -f /var/log/nginx/access.log

Ctrl+A, C — new window

Window 1: application error log

tail -f /var/log/app/error.log

Ctrl+A, C — new window

Window 2: system messages

journalctl -f

“`

Переключайтесь между окнами с помощью `Ctrl+A, "`, чтобы видеть, какой лог генерирует активность.

Автоматизированный скрипт развёртывания с использованием Screen

“`bash

#!/bin/bash

screen -dmS deploy bash -c '

git pull origin main &&

composer install –no-dev &&

php artisan config:cache &&

systemctl reload php8.2-fpm &&

echo "Deployment complete at $(date)" >> /var/log/deploy.log

'

echo "Deployment started in background screen session 'deploy'"

echo "Monitor with: screen -r deploy"

“`

Этот шаблон особенно полезен на VPS с cPanel, где вы можете управлять несколькими развёртываниями приложений из единой административной оболочки.

Доступ к последовательной консоли

“`bash

screen /dev/ttyS0 115200

“`

Screen также работает как эмулятор последовательного терминала. Это стандартный метод доступа к консоли физического сервера, сетевого коммутатора или встраиваемого устройства через последовательное соединение — без необходимости использования minicom или picocom.

Распространённые ошибки и способы их избежать

Вложенные сессии Screen: Если вы подключаетесь по SSH из сессии Screen на машине A на машину B и запускаете там Screen, у вас теперь два уровня обработки `Ctrl+A`. Внутренняя сессия Screen перехватывает `Ctrl+A` раньше, чем его видит внешняя. Чтобы отправить `Ctrl+A` во внешнюю сессию, нажмите `Ctrl+A, Ctrl+A`. Во избежание путаницы измените управляющую клавишу внутренней сессии в её `.screenrc` с помощью `escape ^Bb`.

Мёртвые сессии без очистки: Если Screen аварийно завершается или хост перезагружается некорректно, файлы сокетов могут сохраняться в `/var/run/screen/` или `~/.screen/`, отображая сессии как `Dead`. Очистите их с помощью:

“`bash

screen -wipe

“`

Сессия принадлежит root или пользователю: Сессия Screen, запущенная от имени root, не может быть повторно подключена непривилегированным пользователем, и наоборот. Если вы выполняете `sudo su` внутри сессии Screen и затем отсоединяетесь, повторно подключайтесь от имени root или через `sudo screen -r`.

Несоответствие переменной `TERM`: Некоторые приложения внутри Screen ведут себя некорректно, потому что `TERM` установлен в `screen` или `screen-256color` вместо `xterm-256color`. Если TUI-приложение отображается некорректно, проверьте с помощью `echo $TERM` и при необходимости переопределите в `.screenrc` с помощью `term xterm-256color`.

Исчерпание буфера прокрутки: Буфер прокрутки по умолчанию в 100 строк недостаточен для серьёзного мониторинга логов. Всегда устанавливайте `defscrollback 10000` или выше в `.screenrc` на серверах, используемых для активного администрирования.

Краткий справочник: основные команды Screen

ДействиеКоманда / Сочетание клавиш
Создать новую сессию`screen`
Создать именованную сессию`screen -S name`
Создать отсоединённую сессию`screen -dmS name`
Список сессий`screen -ls`
Повторное подключение по имени`screen -r name`
Принудительное повторное подключение`screen -d -r name`
Многопользовательское подключение`screen -x name`
Отсоединиться`Ctrl+A, D`
Новое окно`Ctrl+A, C`
Следующее окно`Ctrl+A, N`
Предыдущее окно`Ctrl+A, P`
Список окон`Ctrl+A, "`
Переименовать окно`Ctrl+A, A`
Горизонтальное разделение`Ctrl+A, S`
Вертикальное разделение`Ctrl+A,`
Перемещение между регионами`Ctrl+A, Tab`
Войти в режим копирования/прокрутки`Ctrl+A, [`
Вставить из буфера`Ctrl+A, ]`
Заблокировать сессию`Ctrl+A, X`
Закрыть текущее окно`Ctrl+A, K`
Завершить всю сессию`Ctrl+A, `
Отправить команду в сессию`screen -S name -X stuff "cmdn"`
Очистить мёртвые сессии`screen -wipe`

Контекст развёртывания: Screen в управляемых хостинговых средах

Screen работает на уровне оболочки, что делает его совместимым с любой средой Linux, где у вас есть SSH-доступ. Это включает физические серверы, Выделенные Серверы и стандартные экземпляры VPS Хостинга. Он недоступен в средах общего хостинга, где SSH-доступ ограничен или отсутствует.

Для рабочих нагрузок, связанных с постоянной фоновой обработкой — таких как GPU-ускоренный вывод моделей, предобработка больших наборов данных или длительные пакетные задания — сочетание Screen со средой GPU Хостинга обеспечивает как вычислительные ресурсы, так и сохранение сессий, необходимые для надёжного управления многочасовыми заданиями.

Если ваша инфраструктура включает веб-сервисы наряду с фоновой обработкой, сочетание фоновых задач, управляемых Screen, с должным образом защищёнными SSL Сертификатами на ваших публичных конечных точках гарантирует, что весь стек — как видимый прикладной уровень, так и административный бэкенд — работает с надлежащими средствами контроля безопасности.

Матрица решений: когда использовать Screen

Используйте Screen, когда:

  • Вам нужна сохранность сессий на сервере, где доступен только Screen
  • Вы обращаетесь к последовательной консоли или встраиваемому устройству
  • Вы запускаете один длительный процесс и не нуждаетесь в разделённых панелях
  • Вы работаете в минимальной системе на основе Alpine или BusyBox
  • Вам нужно совместно использовать сессию с другим администратором в реальном времени

Рассмотрите tmux вместо Screen, когда:

  • Вам требуется гибкое горизонтальное и вертикальное разделение панелей
  • Вы хотите использовать экосистему плагинов для улучшения строки состояния
  • Вы создаёте среду рабочей станции разработчика со сложными макетами
  • Ваша команда стандартизировала управление конфигурацией tmux

Не используйте ни то, ни другое (используйте systemd или supervisor), когда:

  • Цель — исключительно запуск фоновой службы, которая должна переживать перезагрузки
  • Вам не нужен интерактивный доступ к запущенному процессу
  • Процесс должен автоматически перезапускаться при сбое

Технический контрольный список ключевых выводов

Перед использованием Screen в производственной среде проверьте следующее:

  • `autodetach on` присутствует в `~/.screenrc` — без этого разрывы SSH могут уничтожить сессии
  • `defscrollback` установлен не менее чем в 5000 строк для рабочих нагрузок с интенсивным логированием
  • `defflow off` установлен для предотвращения случайных зависаний `Ctrl+S`
  • Все долго работающие сессии именованы (`-S flag`) — никогда не полагайтесь только на идентификацию по PID
  • Вы знаете команду восстановления `screen -d -r` для устаревших подключённых сессий
  • Сокеты мёртвых сессий периодически очищаются с помощью `screen -wipe`
  • При работе от нескольких пользователей вы понимаете границу владения сессиями root/пользователь
  • Переменная `TERM` проверяется, если TUI-приложения некорректно отображаются внутри Screen
  • Для полностью автоматизированных фоновых заданий используется `screen -dmS`, а не `nohup` или простой `&`, что даёт вам восстанавливаемую, доступную для проверки сессию

Часто задаваемые вопросы

Переживает ли GNU Screen перезагрузку сервера?

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

В чём разница между `screen -r` и `screen -x`?

`screen -r` повторно подключается к отсоединённой сессии — он завершается с ошибкой, если сессия уже подключена в другом месте. `screen -x` подключается к сессии независимо от её текущего состояния подключения, позволяя двум терминалам совместно использовать одну сессию одновременно. Используйте `-x` для совместной отладки; используйте `-r` для стандартного повторного подключения.

Как прокрутить вверх внутри окна Screen?

Войдите в режим копирования с помощью `Ctrl+A, [`, затем используйте клавиши со стрелками, `Page Up`/`Page Down` или навигацию в стиле vi (`Ctrl+F`, `Ctrl+B`). Нажмите `Escape` или `q` для выхода из режима копирования. Убедитесь, что `defscrollback` в `.screenrc` установлен достаточно высоко для сохранения необходимой истории.

Можно ли использовать Screen без привилегий root?

Да. Screen работает полностью от имени вызывающего пользователя. Для создания, подключения или управления сессиями не требуются привилегии root. Файлы сокетов хранятся в каталоге конкретного пользователя (обычно `/var/run/screen/S-username/`). Единственное исключение — если Screen не установлен: установка требует доступа к менеджеру пакетов, что обычно требует root или sudo.

Почему моя сессия Screen отображается как «Attached», хотя никто не подключён?

Обычно это происходит, когда SSH-соединение разорвалось без отправки чистого сигнала SIGHUP — например, из-за тайм-аута сети, а не явного выхода. Сессия сохраняет состояние `Attached`, потому что Screen никогда не получил сигнал отключения. Используйте `screen -d -r session_name` для принудительного отсоединения призрачного соединения и чистого повторного подключения.

15%

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

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

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

Skills
Начать