Защита терминальных сессий: Как GNU Screen спасает терабайтные бэкапы от внезапного обрыва SSH

Классическая история из админской практики: запускаешь тяжелый скрипт архивации (например, backup.sh), который должен упаковать несколько терабайт критических данных на сервере. Процесс долгий, ты сидишь и смотришь в консоль. И тут на самом интересном месте моргает провайдер, отваливается локальный Wi-Fi или рвется сессия OpenSSH / Putty. Связь восстанавливается через минуту, ты заходишь на сервер — и всё прервалось.

Дескрипторы закрылись, демон SSH отправил сигнал SIGHUP (Hangup) всем дочерним процессам внутри этого терминала, и ядро Linux их послушно прибило. Архив побит, время потеряно. Чтобы этого не происходило, нужно изолировать выполнение от сессии пользователя. Использовать для этого утилиту виртуальных экранов — GNU Screen. Она переносит дескрипторы ввода-вывода в безопасную зону оперативной памяти, полностью отвязывая процесс от стабильности твоего сетевого кабеля.

Платформы и установка: Как развернуть Screen

GNU Screen — это классика Unix-систем. Он невероятно легковесен, стабилен и доступен практически на любой платформе. В современных минимальных образах ОС его часто нет из коробки, поэтому ставим руками под нужную платформу:

  • Debian / Ubuntu: Основная рабочая среда. Ставится одной строкой через apt:
    sudo apt update && sudo apt install screen -y
  • RHEL / Rocky Linux / AlmaLinux: Установка через менеджер пакетов dnf:
    sudo dnf install screen -y
  • FreeBSD: Доступен как в портах, так и в виде готового пакета:
    pkg install screen
  • macOS: Если нужно крутить долгие локальные скрипты, ставится через Homebrew:
    brew install screen

Пошаговый разбор: Порядок запуска тяжелого бэкапа

Чтобы запустить архивацию терабайт данных, спокойно закрыть терминал и пойти спать, соблюдайте строгую последовательность действий на клавиатуре:

1. Инициализация именованной сессии
Подключаемся к серверу через Putty или OpenSSH и создаем виртуальный экран. Флаг -S задает понятное имя, чтобы не путаться в PID процессов:

screen -S prod_backup

2. Пропуск приветствия (Важный нюанс)
Утилита при первом открытии выплеснет на экран копирайты и заблокирует ввод. Набивать команды в этот момент бесполезно. Порядок простой: **нажимаем Enter или дважды бьем по Пробелу**. Экран очистится, и вы попадете в чистый шелл виртуального терминала.

3. Запуск долгой задачи
Запускаем наш скрипт архивации терабайтных массивов:

./backup.sh

4. Отключение (Detach)
Скрипт зашуршал дисками, логи упаковки побежали в консоль. Чтобы безопасно отключиться и оставить задачу жить в бэкграунде, прожимаем комбинацию горячих клавиш:
Зажимаем Ctrl + a, отпускаем, а затем нажимаем клавишу d.
Экран закроется, а в основном терминале появится системный маркер [detached from prod_backup]. Всё. Процесс изолирован в памяти ядра. Можно закрывать Putty, выключать компуктер или отправлять сервер в штатный логаут.

5. Возврат в сессию (Attach)
Спустя часы, когда нужно проверить статус архива, снова цепляемся к серверу по SSH и восстанавливаем вывод командой:

screen -r prod_backup

Вы вернетесь ровно в ту же секунду лога, в то же самое состояние консоли, как будто никуда и не уходили.

Ультимативная таблица: Все возможности, команды и горячие клавиши

Для корректной работы со Screen важно четко разделять два режима управления:

  • Команды CLI: Выполняются в обычном терминале (утилиты управления сессиями). Никаких префиксов и хоткеев нажимать не нужно — это стандартный синтаксис Linux.
  • Внутренние команды сессии: Выполняются только тогда, когда вы уже находитесь внутри виртуального экрана. Все они привязаны к префиксу Ctrl + a. Сначала зажимается и отпускается этот хоткей, и только затем нажимается клавиша нужного действия (например, буква команды).

Нюанс: Поскольку Screen перехватывает комбинацию Ctrl + a, стандартная функция Bash (прыжок курсора в начало строки) внутри экрана перестанет работать. Чтобы отправить эту команду именно в шелл, нажмите префикс дважды: Ctrl + a, а затем сразу кнопку a.

Команда в CLI / Хоткей Режим выполнения Что делает в системе и её инженерный смысл
screen -S [имя] CLI (Внешний) Инициализация и запуск новой изолированной сессии под конкретную задачу.
screen -ls CLI (Внешний) Вывод списка всех запущенных экранов, их ID (PID) и текущего статуса (Attached/Detached).
screen -r [имя/PID] CLI (Внешний) Восстановление подключения к существующей фоновой сессии и перехват её дескрипторов.
screen -x [имя] CLI (Внешний) Multi-attach mode (Совместный режим). Подключение к экрану без отключения других админов (второй инженер видит ваш ввод live).
Ctrl + a, затем d Внутренний хоткей Detach (Отключение). Выход из виртуального экрана в основной шелл с сохранением процессов в RAM.
Ctrl + a, затем c Внутренний хоткей Create Window. Создание новой вкладки (виртуального окна) внутри одной запущенной сессии.
Ctrl + a, затем n / p Внутренний хоткей Быстрое переключение на следующее (Next) или предыдущее (Previous) окно внутри сессии.
Ctrl + a, затем " Внутренний хоткей Window List. Вызов интерактивного списка всех открытых внутренних окон для удобной навигации.
Ctrl + a, затем S (заглавная) Внутренний хоткей Split Region. Горизонтальное разделение текущей области терминала на две независимые панели.
Ctrl + a, затем | Внутренний хоткей Split Region. Вертикальное разрезание панели (доступно в актуальных сборках).
Ctrl + a, затем Tab Внутренний хоткей Focus Region. Переключение активного фокуса ввода между разделенными панелями экрана.
Ctrl + a, затем X (заглавная) Внутренний хоткей Kill Region. Закрытие текущей панели без уничтожения запущенного внутри нее шелла.
Ctrl + a, затем k Внутренний хоткей Kill Window. Принудительное уничтожение текущего окна и жесткое завершение работающего в нем процесса.
Ctrl + a, затем [ Внутренний хоткей Copy / Scrollback Mode. Режим просмотра буфера вывода. Позволяет стрелками листать историю логов вверх. Выход — Esc.

Фичи «для продвинутых»: Логирование и защита паролем

GNU Screen умеет в полезные скрытые приемы, которые сильно облегчают жизнь при работе с инфраструктурой:

Тотальное логирование сессии: Если прожать хоткей Ctrl + a, а затем H, Screen начнет записывать абсолютно всё, что происходит на экране (весь вывод бэкапа, ошибки, вводимые команды) в файл screenlog.0 в текущей директории. Повторное нажатие выключает запись. Незаменимо для последующего разбора полетов, если что-то пошло не так.

Блокировка экрана от чужих глаз: Если вам нужно отойти от рабочего места, а сессия на сервере открыта, жмите Ctrl + a, затем x. Screen заблокирует терминал и потребует ввести пароль вашей учетной записи Linux на сервере, чтобы продолжить работу. Процессы заблокированного экрана при этом продолжают выполняться в штатном режиме.

Где Screen бессилен

Утилита работает строго в рамках системных ограничений ядра и не защитит ваши терабайты данных в двух случаях:

  • Отказ по ОЗУ (OOM-Killer): Если ваш скрипт архивации потечет по памяти или сожрет всё свободное пространство в RAM, ядро Linux вызовет внутренний механизм защиты. Ему плевать, что процесс запущен внутри Screen — OOM-Killer без разбора прибьет и сам бэкап, и сервер Screen. Настраивайте лимиты и следите за потреблением ресурсов.
  • Перезагрузка / Сбой питания: Серверная часть GNU Screen живет исключительно в оперативной памяти сервера. При жестком ребуте, падении сервера или отключении питания в ДЦ данные из RAM стираются, а все сессии безвозвратно уничтожаются.

Заключение

Запуск весомых, долгих инфраструктурных задач напрямую в стандартной сессии SSH без подстраховки — это неоправданный риск. Любое микро-колебание сети на пути от вашего провайдера до дата-центра помножит выполненную работу на ноль.

Возьмите за правило: зашли на выделенный сервер для проведения бэкапов, миграций или долгого сбора логов — первым делом разворачивайте именованную сессию GNU Screen. Это базовая админская гигиена, сохраняющая время, файлы и нервы.

👁️ 12

Защита терминальных сессий: Как GNU Screen спасает терабайтные бэкапы от внезапного обрыва SSH: 3 комментария

  1. привет, игорь! слушай, задам вопрос крайне ламерский, если что, не суди строго. скажи пожалуйста, вот я не совсем понял: эта инструкция годится только для серверов под управлением по ssh, или же её можно применить к бытовым задачам? простой пример: ставим выкачивать нечто грандиозно громоздкое при помощи wget или curl, поставили наночь, да и спать завалились. а на утро глядь- а загрузка прервалась, судя по логу, часа в три ночи. нет, wget -c — это само собой, но если мы, допустим, выкачиваем сайт целиком, или плейлист под сотню видео при помощи yt-dlp, и поди пойми, какой из видиков докачался не полностью? или конвертация сразу кучи файлов. да мало ли чего ещё можно в пример привести. так вот, годится ли эта инструкция для бытовых задач, и если да, то как её под них адаптировать? P.S. если за такие вопросы решишь закидать кирпичами, тапками и помидорами, то я не в притензии. 🙂 😀 😉





    1. Привет!
      Инструкция подходит и для бытовых задач.
      Адаптировать ничего не нужно. Единственное, комп не выключать во время процесса. В остальном все также будет.





    2. Главное помни: если выключишь питание или уйдешь в ребут — сессия Screen умрет вместе с данными в оперативной памяти.





Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

8 + двадцать =

root@phoenix901:~# connect
[×]

Получай дайджест раз в неделю.
Без спама.