15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало
08.10.2024

Пълното ръководство за команди на 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 Screentmux
Наличност по подразбиранеПредварително инсталиран на повечето дистрибуцииИзисква изрична инсталация
Конфигурационен файл`~/.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` за принудително откачване на призрачната връзка и чисто повторно прикачване.

15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало