15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți
09.10.2024

Utilizarea GNU Screen pentru Atașarea și Detașarea Sesiunilor de Consolă

GNU Screen este un multiplexor de terminal care vă permite să creați, să gestionați și să reluați persistent mai multe sesiuni shell independente dintr-o singură conexiune de terminal. Când detașați o sesiune Screen, fiecare proces care rulează în interiorul ei continuă să se execute în fundal — supraviețuind deconectărilor SSH, întreruperilor de rețea și închiderilor de terminal — până când reatasați sau terminați explicit sesiunea.

Această capacitate este indispensabilă pentru administratorii de sistem care gestionează servere la distanță prin SSH. Indiferent dacă compilați o bază de cod mare, rulați o migrare de baze de date, monitorizați jurnale sau executați un job de backup de mai multe ore, Screen asigură continuarea lucrului indiferent de ce se întâmplă cu conexiunea clientului dvs.

De ce GNU Screen contează în continuare în infrastructura modernă

Instrumente precum `tmux` au câștigat popularitate, dar GNU Screen rămâne omniprezent în mediile Linux enterprise, sistemele embedded și infrastructura legacy. Este livrat ca pachet implicit sau aproape implicit pe majoritatea distribuțiilor de server, nu necesită nicio configurare pentru a fi imediat util, iar modelul său de persistență a sesiunilor este extrem de solid. Pe un VPS sau un server dedicat unde timpul de funcționare și execuția neîntreruptă a sarcinilor sunt critice, Screen este adesea calea cea mai rapidă către o sesiune persistentă fiabilă.

Avantaje operaționale cheie:

  • Persistența sesiunii în caz de deconectare — procesele supraviețuiesc timeout-urilor SSH și întreruperilor de rețea
  • Multiplexare multi-fereastră — rulați sarcini paralele în cadrul unei singure conexiuni SSH
  • Consum redus de resurse — amprentă neglijabilă de CPU și memorie față de alternativele bazate pe GUI
  • Gestionare scriptabilă a sesiunilor — automatizați crearea sesiunilor și injectarea comenzilor prin scripturi shell
  • Compatibilitate largă — disponibil pe practic orice sistem conform POSIX

GNU Screen vs. tmux: Alegerea multiplexorului potrivit

Ambele instrumente rezolvă aceeași problemă de bază, dar diferă semnificativ în arhitectură, profunzimea configurării și ergonomia scriptingului.

FuncționalitateGNU Screentmux
Disponibilitate implicităPreinstalat pe majoritatea distribuțiilorNecesită instalare explicită
Fișier de configurare`.screenrc``.tmux.conf`
Împărțire panouriVerticală și orizontală (limitată)Împărțire completă a panourilor cu layout-uri
Scripting / automatizareInjectare comenzi `screen -X``tmux send-keys`, API bogat
Personalizare bară de stareDe bazăFoarte personalizabilă
Mod copiereSimilar Vi, mai puțin intuitivModuri Vi și Emacs, integrare clipboard
Partajare sesiuneSuportat prin flag-ul `-x`Suportat nativ
Curbă de învățareUșoarăModerată
Caz de utilizare idealSesiuni persistente rapide, sisteme legacyFluxuri de lucru complexe cu mai multe panouri

Pentru persistența simplă a sesiunilor pe un server la distanță — cel mai frecvent caz de utilizare pentru un sysadmin — simplitatea Screen este o caracteristică, nu o limitare.

Instalarea GNU Screen

Înainte de a continua, verificați dacă Screen este deja prezent:

“`bash

screen –version

“`

Dacă nu este instalat, utilizați managerul de pachete corespunzător distribuției dvs.

Debian / Ubuntu:

“`bash

sudo apt-get update && sudo apt-get install screen

“`

CentOS / RHEL 7 și versiuni anterioare:

“`bash

sudo yum install screen

“`

CentOS Stream / RHEL 8+ / Fedora:

“`bash

sudo dnf install screen

“`

Arch Linux:

“`bash

sudo pacman -S screen

“`

macOS (prin Homebrew):

“`bash

brew install screen

“`

Verificare:

“`bash

screen –version

Output example: Screen version 4.09.00 (GNU) 30-Jan-22

“`

Pornirea unei sesiuni Screen

Pornire de bază a sesiunii

“`bash

screen

“`

Aceasta vă plasează într-o nouă sesiune Screen cu un prompt shell standard. Sesiunii i se atribuie automat un identificator numeric bazat pe PID.

Sesiuni cu nume (Recomandat cu tărie)

Denumiți întotdeauna sesiunile în mediile de producție. Sesiunile cu nume sunt mult mai ușor de identificat și reatașat atunci când aveți mai multe joburi concurente în execuție:

“`bash

screen -S session_name

“`

Exemple practice:

“`bash

screen -S db_migration

screen -S log_monitor

screen -S build_job

“`

Denumirea este deosebit de valoroasă atunci când gestionați mai multe sarcini de lucru pe un server dedicat unde mai mulți administratori pot lucra simultan.

Pornirea unei sesiuni cu o comandă

Puteți lansa Screen și executa imediat o comandă în interiorul acestuia:

“`bash

screen -S backup_job bash -c 'rsync -avz /data/ /backup/ && echo "Done"'

“`

Sesiunea persistă chiar și după finalizarea comenzii, permițându-vă să vă reatașați și să inspectați rezultatul.

Detașarea de la o sesiune Screen

Detașarea este fluxul de lucru de bază care face Screen valoros. Suspendă vizualizarea sesiunii, lăsând totul din interior să ruleze în continuare.

Scurtătură de tastatură:

“`

Ctrl + A, then D

“`

  • `Ctrl + A` — prefixul de comandă Screen (toate comenzile Screen încep cu acesta)
  • `D` — detașare

După detașare, terminalul dvs. revine la promptul shell original. Sesiunea Screen și toate procesele din interiorul ei continuă să ruleze în fundal. Veți vedea un mesaj de confirmare:

“`

[detached from 12345.db_migration]

“`

Capcană critică: Nu confundați detașarea (`Ctrl+A, D`) cu închiderea unei ferestre (`Ctrl+A, K` ucide fereastra curentă). Închiderea tuturor ferestrelor termină sesiunea în întregime.

Listarea sesiunilor Screen active

“`bash

screen -ls

“`

Exemplu de rezultat:

“`

There are screens on:

18423.db_migration (Detached)

18891.log_monitor (Attached)

19204.build_job (Detached)

3 Sockets in /var/run/screen/S-root.

“`

Indicatorii de stare sunt semnificativi:

  • Detached — niciun terminal nu este conectat în prezent; sesiunea rulează în fundal
  • Attached — un terminal este conectat activ la această sesiune
  • Dead — procesul sesiunii s-a încheiat, dar fișierul socket nu a fost curățat (utilizați `screen -wipe` pentru a elimina sesiunile moarte)

Reatașarea la o sesiune Screen

Reatașare după numele sesiunii

“`bash

screen -r db_migration

“`

Reatașare după PID-ul sesiunii

“`bash

screen -r 18423

“`

Reatașare când există o singură sesiune

“`bash

screen -r

“`

Screen se va reatașa automat dacă există o singură sesiune detașată.

Reatașare forțată la o sesiune deja atașată

Acesta este scenariul care surprinde mulți administratori. Dacă conexiunea SSH a căzut brusc, sesiunea poate apărea în continuare ca Attached deoarece terminalul anterior nu s-a detașat curat. Încercarea unui `screen -r` standard va eșua cu:

“`

There is a screen on: 18891.log_monitor (Attached)

There is no screen to be resumed.

“`

Soluția este să detașați forțat terminalul vechi și să vă reatașați imediat:

“`bash

screen -d -r log_monitor

“`

  • `-d` — detașează de la distanță sesiunea de la orice terminal o deține în prezent
  • `-r` — reatașează la terminalul curent

Alternativă cu ID de sesiune explicit:

“`bash

screen -d -r 18891

“`

Aceasta este una dintre cele mai importante comenzi Screen din punct de vedere operațional și este frecvent necesară după deconectări neașteptate de la un VPS.

Gestionarea mai multor ferestre în cadrul unei sesiuni

Una dintre cele mai puternice funcționalități ale Screen este capacitatea de a rula mai multe ferestre independente (terminale virtuale) în cadrul unei singure sesiuni. Fiecare fereastră își menține propriul shell, arbore de procese și buffer de derulare.

Crearea unei noi ferestre

“`

Ctrl + A, then C

“`

AcțiuneScurtătură
Fereastra următoare`Ctrl + A, N`
Fereastra anterioară`Ctrl + A, P`
Mergi la fereastra după număr`Ctrl + A, [0-9]`
Listă interactivă de ferestre`Ctrl + A, "`
Ultima fereastră activă`Ctrl + A, Ctrl + A`

Denumirea unei ferestre

“`

Ctrl + A, then A

“`

Vi se va solicita să introduceți un nume pentru fereastra curentă. Ferestrele cu nume apar în lista de ferestre și în bara de stare, facilitând semnificativ navigarea atunci când rulați cinci sau mai multe sarcini paralele.

Închiderea unei ferestre

Tastați `exit` în shell sau apăsați `Ctrl + D`. Când ultima fereastră dintr-o sesiune este închisă, sesiunea Screen în sine se termină.

Pentru a ucide forțat fereastra curentă fără a ieși din shell:

“`

Ctrl + A, then K

“`

Împărțirea ecranului (Regiuni)

GNU Screen suportă împărțirea de bază a terminalului, care este mai puțin flexibilă decât tmux, dar funcțională pentru monitorizare alăturată.

Împărțire orizontală (sus/jos):

“`

Ctrl + A, then S

“`

Împărțire verticală (stânga/dreapta):

“`

Ctrl + A, then |

“`

Mutați focusul la regiunea următoare:

“`

Ctrl + A, then Tab

“`

Eliminați regiunea curentă (fără a închide fereastra):

“`

Ctrl + A, then X

“`

Eliminați toate regiunile cu excepția celei curente:

“`

Ctrl + A, then Q

“`

După împărțire, fiecare regiune este inițial goală. Navigați la o regiune cu `Tab` și apoi deschideți o fereastră în ea folosind `Ctrl + A, N` sau `Ctrl + A, "`.

Partajarea unei sesiuni Screen între mai mulți utilizatori

Screen suportă partajarea sesiunilor între mai mulți utilizatori, ceea ce este util pentru depanare colaborativă sau administrare în pereche. Aceasta necesită ca Screen să fie instalat cu permisiuni setuid.

Activați modul multi-utilizator în cadrul unei sesiuni:

“`

Ctrl + A, then :multiuser on

“`

Acordați acces unui alt utilizator:

“`

Ctrl + A, then :acladd username

“`

Celălalt utilizator se poate atașa apoi la sesiunea dvs.:

“`bash

screen -x your_username/session_name

“`

Notă de securitate: Sesiunile Screen multi-utilizator necesită un control atent al accesului. Acordați permisiuni `acladd` doar conturilor de încredere. În mediile de hosting partajat, această funcționalitate este de obicei restricționată.

Trimiterea comenzilor către o sesiune detașată

Una dintre capacitățile subevaluate ale Screen este posibilitatea de a injecta comenzi într-o sesiune în execuție fără a vă reatașa:

“`bash

screen -S db_migration -X stuff "tail -f /var/log/app.logn"

“`

Comanda `-X stuff` trimite apăsări de taste sesiunii ca și cum ar fi tastate. `n` simulează apăsarea Enter. Aceasta este extrem de utilă pentru scripturile de automatizare care trebuie să interacționeze cu o sesiune Screen în execuție.

Configurarea Screen cu .screenrc

Fișierul `.screenrc` din directorul dvs. home controlează comportamentul implicit al Screen. O configurare minimă dar practică:

“`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

“`

Setarea `defscrollback 10000` este deosebit de importantă — buffer-ul implicit de derulare are doar 100 de linii, ceea ce este insuficient pentru monitorizarea proceselor de lungă durată.

Referință completă a comenzilor Screen

Comandă / ScurtăturăFuncție
`screen`Pornește o nouă sesiune fără nume
`screen -S name`Pornește o sesiune cu nume
`screen -ls`Listează toate sesiunile
`screen -r name`Reatașează la o sesiune detașată
`screen -d -r name`Detașare forțată și reatașare
`screen -x name`Atașare la o sesiune deja atașată (vizualizare partajată)
`screen -wipe`Elimină socket-urile sesiunilor moarte
`Ctrl + A, D`Detașează de la sesiunea curentă
`Ctrl + A, C`Creează o fereastră nouă
`Ctrl + A, N`Fereastra următoare
`Ctrl + A, P`Fereastra anterioară
`Ctrl + A, "`Listă interactivă de ferestre
`Ctrl + A, A`Redenumește fereastra curentă
`Ctrl + A, K`Ucide fereastra curentă
`Ctrl + A, S`Împărțire orizontală
`Ctrl + A,`Împărțire verticală
`Ctrl + A, Tab`Mută la regiunea următoare
`Ctrl + A, Q`Elimină toate regiunile cu excepția celei curente
`Ctrl + A, [`Intră în modul copiere/derulare
`Ctrl + A, ?`Afișează toate legăturile de taste
`Ctrl + A, :quit`Termină întreaga sesiune

Înregistrarea rezultatelor sesiunii Screen

Screen poate înregistra tot ce este afișat într-o fereastră într-un fișier — de neprețuit pentru auditarea joburilor de lungă durată:

Comutați înregistrarea pentru fereastra curentă:

“`

Ctrl + A, then H

“`

Aceasta creează un fișier numit `screenlog.N` (unde N este numărul ferestrei) în directorul curent. Puteți activa înregistrarea și din linia de comandă la pornirea unei sesiuni:

“`bash

screen -L -S monitored_job

“`

Sau specificați un fișier de jurnal personalizat în `.screenrc`:

“`bash

logfile /var/log/screen/session_%t_%Y%m%d.log

“`

Cazuri practice de utilizare pe servere la distanță

Migrări de baze de date de lungă durată: Porniți o migrare într-o sesiune Screen cu nume, detașați și monitorizați progresul reatașându-vă periodic. Dacă conexiunea SSH cade, migrarea continuă neîntrerupt.

Monitorizare continuă a jurnalelor: Rulați `tail -f` sau `multitail` într-o fereastră Screen. Detașați și reatașați ori de câte ori trebuie să verificați starea curentă.

Joburi de compilare: Compilările mari de C++ sau kernel pot dura ore. Screen asigură finalizarea build-ului chiar dacă laptopul dvs. pierde conectivitatea.

Procese interactive care nu pot fi trimise în fundal: Unele instrumente — CLI-uri de baze de date, sesiuni interactive Python, instalatori bazați pe text — nu pot fi pur și simplu trimise în fundal cu `&`. Screen le înfășoară curat într-o sesiune persistentă.

Coordonare între mai mulți administratori: Folosind `screen -x`, doi administratori pot observa simultan aceeași sesiune, ceea ce este util în timpul răspunsului la incidente pe un server dedicat.

Dacă gestionați infrastructură web alături de sesiuni persistente, combinarea Screen cu un VPS cu cPanel bine configurat vă oferă atât o interfață de gestionare grafică, cât și capacitate completă de multiplexare a terminalului. Pentru echipele care gestionează reînnoirile SSL și implementările de certificate prin linia de comandă, Certificatele SSL combinate cu scripturile de automatizare bazate pe Screen pot face procesul complet automat.

Capcane frecvente și cum să le evitați

Acumularea sesiunilor orfane: Administratorii uită frecvent să termine sesiunile după finalizarea joburilor. Rulați `screen -ls` regulat și folosiți `screen -wipe` pentru a curăța socket-urile moarte. Terminați sesiunile inactive cu `screen -S session_name -X quit`.

Buffer de derulare prea mic: Buffer-ul implicit de 100 de linii înseamnă că pierdeți rapid istoricul rezultatelor. Setați întotdeauna `defscrollback 10000` sau mai mult în `.screenrc`.

Sesiuni Screen imbricate: Dacă vă conectați prin SSH din interiorul unei sesiuni Screen și porniți o altă sesiune Screen pe gazda la distanță, comenzile `Ctrl + A` vor fi capturate de sesiunea exterioară. Folosiți `Ctrl + A, A` pentru a trimite un `Ctrl + A` literal sesiunii interioare sau utilizați `Ctrl + A, :sessionname` pentru a diferenția.

Sesiune rămasă Attached după deconectare: O conexiune SSH căzută poate lăsa o sesiune în starea Attached. Folosiți întotdeauna `screen -d -r` în loc de simplu `screen -r` când vă reconectați după o deconectare neașteptată.

Probleme de locale și codificare: Dacă vedeți caractere distorsionate, asigurați-vă că atât terminalul, cât și Screen folosesc UTF-8. Adăugați `defutf8 on` în `.screenrc` și verificați că variabila de mediu `LANG` este setată la un locale UTF-8 (de ex., `en_US.UTF-8`).

Matrice de decizie: Când să folosiți Screen

ScenariuFolosiți Screen?Note
Proces la distanță de lungă duratăDaCaz de utilizare principal
Comandă SSH rapidă, unicăNuOverhead nejustificat
Flux de lucru cu mai multe panouriPoateLuați în considerare tmux pentru layout-uri complexe
Sesiune de depanare partajatăDaFolosiți `-x` pentru vizualizare partajată
Script automatizat fără interacțiuneNuFolosiți serviciul `nohup` sau `systemd`
Proces interactiv care nu poate fi daemonizatDaScreen este ideal
Dashboard de monitorizare persistentDaCombinați cu ferestre cu nume și înregistrare

Listă de verificare a punctelor cheie tehnice

  • Denumiți întotdeauna sesiunile cu `screen -S descriptive_name` — sesiunile fără nume devin imposibil de gestionat la scară
  • Setați `defscrollback 10000` în `.screenrc` înainte să aveți nevoie, nu după ce pierdeți rezultatele
  • Folosiți `screen -d -r` ca comandă implicită de reatașare pentru a gestiona atât stările Attached, cât și Detached fără să vă gândiți
  • Activați înregistrarea sesiunii cu `screen -L` pentru orice job al cărui rezultat ar putea trebui auditat ulterior
  • Rulați `screen -wipe` periodic pentru a elimina socket-urile sesiunilor moarte și a menține rezultatul `screen -ls` lizibil
  • Injectați comenzi în sesiunile detașate cu `screen -X stuff` pentru a automatiza interacțiunea fără reatașare
  • Pentru mediile cu mai mulți administratori, configurați `.screenrc` cu `multiuser on` și ACL-uri explicite în loc să vă bazați pe acces root partajat
  • Testați configurația `.screenrc` pe un sistem non-producție înainte de a o implementa pe infrastructura critică

Întrebări frecvente

Ce se întâmplă cu o sesiune Screen dacă serverul repornește?

Toate sesiunile Screen se pierd la repornire. Sesiunile Screen sunt procese care rulează în memorie — nu supraviețuiesc unei reporniri a sistemului. Pentru servicii cu adevărat persistente, folosiți fișiere unit `systemd` sau scripturi init. Screen este pentru persistența sesiunilor interactive în caz de deconectare, nu în caz de repornire.

Pot folosi Screen pe un cont de hosting partajat?

Mediile standard de web hosting partajat restricționează de obicei accesul SSH și este posibil să nu aibă Screen instalat sau accesibil. Screen este cel mai eficient pe medii VPS sau server dedicat unde aveți acces complet la shell și privilegii root sau sudo.

Care este diferența dintre `screen -r` și `screen -x`?

`screen -r` se reatașează la o sesiune detașată, oferindu-vă acces exclusiv. `screen -x` se atașează la o sesiune care este deja atașată, creând o vizualizare partajată în care mai multe terminale văd aceeași sesiune simultan — util pentru depanare colaborativă.

Cum derulați în sus într-o sesiune Screen pentru a vedea rezultatele anterioare?

Intrați în modul copiere/derulare cu `Ctrl + A, [`. Folosiți tastele săgeată sau Page Up/Page Down pentru a naviga. Apăsați `Escape` sau `Q` pentru a ieși din modul copiere. Asigurați-vă că buffer-ul de derulare este suficient de mare setând `defscrollback` în `.screenrc`.

GNU Screen este în continuare menținut activ?

Da. GNU Screen este menținut activ în cadrul Proiectului GNU. Versiunea 4.9.x a fost lansată în 2022. Deși nu primește dezvoltarea rapidă de funcționalități pe care o primește tmux, primește patch-uri de securitate și corecții de erori, făcându-l fiabil pentru utilizarea în producție pe infrastructura de server cu funcționare îndelungată.

15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți