Пълното ръководство за команди на 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 Screen | tmux |
|---|
| — | — | — |
|---|
| Наличност по подразбиране | Предварително инсталиран на повечето дистрибуции | Изисква изрична инсталация |
|---|
| Конфигурационен файл | `~/.screenrc` | `~/.tmux.conf` |
|---|
| Разделяне на панели (хоризонтално/вертикално) | Ограничено (само вертикално чрез региони) | Пълно, гъвкаво разделяне на панели |
|---|
| Споделяне на сесии | Нативно многократно прикачване | Нативно многократно прикачване |
|---|
| Скриптиране / автоматизация | Инжектиране на команди чрез `screen -X` | `tmux send-keys`, богат API |
|---|
| Разход на памет | Много нисък | Нисък |
|---|
| Поддръжка на серийни устройства | Да (`screen /dev/ttyS0`) | Не |
|---|
| Персонализиране на статус лентата | Умерено (hardstatus) | Много гъвкаво |
|---|
| Режим на копиране | vi стил | vi или emacs стил |
|---|
| Екосистема от плъгини | Няма | Активна (TPM) |
|---|
| Идеален случай на употреба | Минимални сървъри, серийни конзоли, legacy среди | Разработчески работни станции, сложни оформления |
|---|
Практически насоки: На headless Dedicated Server, изпълняващ дългосрочни фонови задачи, простотата и универсалната наличност на 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 започва с escape последователността `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`. За да избегнете объркване, променете escape клавиша на вътрешната сесия в нейния `.screenrc` с `escape ^Bb`.
Мъртви сесии, които не се почистват: Ако Screen се срине или хостът се рестартира нечисто, файловете на сокетите може да останат в `/var/run/screen/` или `~/.screen/`, показвайки сесии като `Dead`. Почистете ги с:
“`bash
screen -wipe
“`
Сесия, притежавана от root срещу потребител: Screen сесия, стартирана като 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 сървъри, Dedicated Servers и стандартни VPS Хостинг инстанси. Не е наличен в среди за споделен хостинг, където SSH достъпът е ограничен или липсва.
За натоварвания, включващи постоянна фонова обработка — като GPU-ускорено извеждане на модели, предварителна обработка на големи набори от данни или дълготрайни пакетни задачи — комбинирането на Screen с GPU Хостинг среда ви дава както изчислителните ресурси, така и устойчивостта на сесиите, необходими за надеждно управление на многочасови задачи.
Ако инфраструктурата ви включва уеб-ориентирани услуги наред с фонова обработка, съчетаването на Screen-управлявани backend задачи с правилно защитени SSL Сертификати на публичните ви крайни точки гарантира, че целият стек — както видимият приложен слой, така и административният backend — работи с подходящи контроли за сигурност.
Матрица за вземане на решения: Кога да използвате 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` за принудително откачване на призрачната връзка и чисто повторно прикачване.
