Використання GNU Screen для підключення та від’єднання консольних сесій
GNU Screen — це термінальний мультиплексор, який дозволяє створювати, керувати та відновлювати кілька незалежних сеансів оболонки з одного термінального підключення. Коли ви від’єднуєтесь від сеансу Screen, кожен процес, що виконується всередині нього, продовжує працювати у фоновому режимі — переживаючи відключення SSH, перебої в мережі та закриття термінала — доки ви явно не повторно підключитесь або не завершите сеанс.
Ця можливість є незамінною для системних адміністраторів, які керують віддаленими серверами через SSH. Незалежно від того, чи компілюєте ви великий код, виконуєте міграцію бази даних, відстежуєте журнали або запускаєте багатогодинне завдання резервного копіювання, Screen гарантує, що робота продовжиться незалежно від того, що відбудеться з вашим клієнтським підключенням.
Чому GNU Screen залишається актуальним у сучасній інфраструктурі
Такі інструменти, як `tmux`, набули популярності, але GNU Screen залишається повсюдно поширеним у корпоративних Linux-середовищах, вбудованих системах та застарілій інфраструктурі. Він постачається як стандартний або майже стандартний пакет у більшості серверних дистрибутивів, не потребує жодного налаштування для негайного використання, а його модель збереження сеансів є надійною. На VPS або виділеному сервері, де критично важливі безперебійна робота та виконання завдань, Screen часто є найшвидшим шляхом до надійного постійного сеансу.
Ключові операційні переваги:
- Збереження сеансу при відключеннях — процеси переживають тайм-аути SSH та перебої в мережі
- Мультиплексування вікон — виконання паралельних завдань у межах одного SSH-підключення
- Низьке споживання ресурсів — незначне навантаження на CPU та пам’ять порівняно з графічними альтернативами
- Керування сеансами за допомогою скриптів — автоматизація створення сеансів та введення команд через shell-скрипти
- Широка сумісність — доступний практично на кожній POSIX-сумісній системі
GNU Screen проти 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` — підключитися до поточного термінала
Альтернатива з явним ідентифікатором сеансу:
“`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, від’єднайтесь і periodically перевіряйте прогрес, повторно підключаючись. Якщо 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, він отримує виправлення безпеки та виправлення помилок, що робить його надійним для використання у виробничій серверній інфраструктурі з тривалим терміном роботи.
