Полное руководство по командам 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 Screen | tmux |
|---|
| — | — | — |
|---|
| Доступность по умолчанию | Предустановлен в большинстве дистрибутивов | Требует явной установки |
|---|
| Файл конфигурации | `~/.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` для принудительного отсоединения призрачного соединения и чистого повторного подключения.
