Използване на GNU Screen за прикачване и откачване на конзолни сесии
GNU Screen е терминален мултиплексор, който ви позволява да създавате, управлявате и възобновявате множество независими шел сесии от една терминална връзка. Когато откачите Screen сесия, всеки процес, изпълняващ се в нея, продължава да работи във фонов режим — оцелявайки при SSH прекъсвания, мрежови сривове и затваряне на терминала — докато изрично не се свържете отново или прекратите сесията.
Тази възможност е незаменима за системни администратори, управляващи отдалечени сървъри чрез SSH. Независимо дали компилирате голяма кодова база, изпълнявате миграция на база данни, наблюдавате логове или стартирате многочасово архивиране, Screen гарантира, че работата продължава независимо какво се случи с клиентската ви връзка.
Защо GNU Screen все още е важен в съвременната инфраструктура
Инструменти като `tmux` набраха популярност, но GNU Screen остава широко разпространен в корпоративни Linux среди, вградени системи и legacy инфраструктура. Той се доставя като пакет по подразбиране или близо до такъв в повечето сървърни дистрибуции, не изисква никаква конфигурация, за да бъде незабавно полезен, а моделът му за устойчивост на сесиите е изключително надежден. На VPS или dedicated сървър, където непрекъснатостта на работата и изпълнението на задачите са от критично значение, Screen често е най-бързият път към надеждна постоянна сесия.
Основни оперативни предимства:
- Устойчивост на сесиите при прекъсвания — процесите оцеляват при SSH таймаути и мрежови прекъсвания
- Мулти-прозоречен мултиплексинг — изпълнявайте паралелни задачи в рамките на една SSH връзка
- Ниско натоварване на ресурсите — пренебрежимо малко CPU и памет в сравнение с GUI-базирани алтернативи
- Скриптируемо управление на сесии — автоматизирайте създаването на сесии и инжектирането на команди чрез шел скриптове
- Широка съвместимост — налично на практически всяка POSIX-съвместима система
GNU Screen срещу tmux: Избор на правилния мултиплексор
И двата инструмента решават един и същ основен проблем, но се различават съществено по архитектура, дълбочина на конфигурацията и ергономика при скриптиране.
| Функция | GNU Screen | tmux |
|---|
| — | — | — |
|---|
| Наличност по подразбиране | Предварително инсталиран на повечето дистрибуции | Изисква изрична инсталация |
|---|
| Конфигурационен файл | `.screenrc` | `.tmux.conf` |
|---|
| Разделяне на панели | Вертикално и хоризонтално (ограничено) | Пълно разделяне на панели с оформления |
|---|
| Скриптиране / автоматизация | `screen -X` инжектиране на команди | `tmux send-keys`, богат API |
|---|
| Персонализиране на лентата за статус | Основно | Силно персонализируемо |
|---|
| Режим на копиране | Vi-подобен, по-малко интуитивен | Vi и Emacs режими, интеграция с клипборда |
|---|
| Споделяне на сесии | Поддържано чрез флаг `-x` | Поддържано нативно |
|---|
| Крива на обучение | Плитка | Умерена |
|---|
| Идеален случай на употреба | Бързи постоянни сесии, legacy системи | Сложни работни процеси с множество панели |
|---|
За обикновена устойчивост на сесии на отдалечен сървър — най-честият случай на употреба за системен администратор — простотата на 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
“`
Именуването е особено ценно при управление на множество натоварвания на dedicated сървър, където няколко администратори могат да работят едновременно.
Стартиране на сесия с команда
Можете да стартирате 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 сесия, откачете се и наблюдавайте напредъка, като се свързвате периодично. Ако SSH връзката прекъсне, миграцията продължава без прекъсване.
Непрекъснато наблюдение на логове: Изпълнявайте `tail -f` или `multitail` в Screen прозорец. Откачете се и се свързвайте отново, когато трябва да проверите текущото състояние.
Задачи за компилация: Голямо компилиране на C++ или ядро може да отнеме часове. Screen гарантира, че компилацията завършва дори ако лаптопът ви загуби свързаност.
Интерактивни процеси, които не могат да бъдат пуснати на заден план: Някои инструменти — CLI за бази данни, интерактивни Python сесии, текстово базирани инсталатори — не могат просто да бъдат изпратени на заден план с `&`. Screen ги обвива в постоянна сесия по чист начин.
Координация между множество администратори: Чрез `screen -x` двама администратори могат да наблюдават едновременно една и съща сесия, което е полезно при реагиране на инциденти на dedicated сървър.
Ако управлявате уеб инфраструктура заедно с постоянни сесии, комбинирането на 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` unit файлове или init скриптове. Screen е предназначен за устойчивост на интерактивни сесии при прекъсвания на връзката, а не при рестартирания.
Мога ли да използвам Screen в акаунт за споделен хостинг?
Стандартните среди за споделен уеб хостинг обикновено ограничават SSH достъпа и може да нямат инсталиран или достъпен Screen. Screen е най-ефективен в среди с VPS или dedicated сървър, където имате пълен достъп до шела и 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, той получава корекции за сигурност и поправки на грешки, което го прави надежден за производствена употреба в дълготрайна сървърна инфраструктура.
