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 проти 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` — підключитися до поточного термінала

Альтернатива з явним ідентифікатором сеансу:

“`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, він отримує виправлення безпеки та виправлення помилок, що робить його надійним для використання у виробничій серверній інфраструктурі з тривалим терміном роботи.

15%

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

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

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

Skills
Почати