15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати
08.10.2024

Повний посібник з команд GNU Screen у Linux

GNU Screen — це термінальний мультиплексор, який дозволяє створювати, керувати та зберігати кілька сеансів оболонки в одному вікні терміналу. Коли ви від’єднуєтесь від сеансу Screen, кожен процес, що виконується всередині нього, продовжує працювати — переживаючи відключення SSH, перебої в мережі та закриття терміналу — і залишається повністю доступним у момент повторного підключення.

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

Чому GNU Screen залишається актуальним у сучасному адмініструванні Linux

Такі інструменти, як tmux, набули популярності, але Screen постачається як стандартний або майже стандартний пакет практично в кожному корпоративному дистрибутиві Linux та мінімальному образі сервера. Коли ви підключаєтесь через SSH до bare-metal машини або щойно розгорнутого екземпляра VPS Хостингу, Screen майже завжди доступний без додаткової установки. Низьке споживання пам’яті та відповідність стандарту POSIX роблять його прагматичним вибором у обмежених або захищених середовищах.

Основні можливості:

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

GNU Screen проти 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, не може бути повторно підключений не-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-доступ. Це включає bare-metal сервери, Виділені Сервери та стандартні екземпляри VPS Хостингу. Він недоступний у середовищах спільного хостингу, де SSH-доступ обмежений або відсутній.

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

Якщо ваша інфраструктура включає веб-сервіси поряд із фоновою обробкою, поєднання фонових завдань, керованих Screen, із належно захищеними SSL Сертифікатами на ваших публічних кінцевих точках забезпечує роботу всього стека — як видимого рівня застосунку, так і адміністративного бекенду — з відповідними засобами контролю безпеки.

Матриця рішень: коли використовувати Screen

Використовуйте Screen, коли:

  • Вам потрібне збереження сеансу на сервері, де доступний лише Screen
  • Ви отримуєте доступ до послідовної консолі або вбудованого пристрою
  • Ви запускаєте один тривалий процес і не потребуєте розділених панелей
  • Ви працюєте в мінімальній системі на базі Alpine або BusyBox
  • Вам потрібно поділитися сеансом з іншим адміністратором у реальному часі

Розгляньте tmux замість цього, коли:

  • Вам потрібне гнучке горизонтальне та вертикальне розділення панелей
  • Ви хочете екосистему плагінів для покращення рядка стану
  • Ви створюєте середовище робочої станції розробника зі складними макетами
  • Ваша команда стандартизувала управління конфігурацією 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
Почати