15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij
09.10.2024

Używanie GNU Screen do dołączania i odłączania sesji konsoli

GNU Screen to multiplekser terminali, który pozwala tworzyć, zarządzać i trwale wznawiać wiele niezależnych sesji powłoki z jednego połączenia terminalowego. Gdy odłączysz sesję Screen, każdy uruchomiony w niej proces kontynuuje działanie w tle — przeżywając rozłączenia SSH, przerwy w sieci i zamknięcia terminala — dopóki jawnie nie ponownie podłączysz lub nie zakończysz sesji.

Ta możliwość jest niezbędna dla administratorów systemów zarządzających zdalnymi serwerami przez SSH. Niezależnie od tego, czy kompilujesz duży kod źródłowy, uruchamiasz migrację bazy danych, monitorujesz logi czy wykonujesz wielogodzinne zadanie tworzenia kopii zapasowej, Screen zapewnia kontynuację pracy niezależnie od tego, co dzieje się z połączeniem klienta.

Dlaczego GNU Screen nadal ma znaczenie we współczesnej infrastrukturze

Narzędzia takie jak `tmux` zyskały popularność, ale GNU Screen pozostaje wszechobecny w korporacyjnych środowiskach Linux, systemach wbudowanych i starszej infrastrukturze. Jest dostarczany jako domyślny lub prawie domyślny pakiet w większości dystrybucji serwerowych, nie wymaga żadnej konfiguracji, aby być natychmiast użytecznym, a jego model trwałości sesji jest niezawodny. Na VPS lub serwerze dedykowanym, gdzie czas pracy i nieprzerwane wykonywanie zadań są krytyczne, Screen jest często najszybszą drogą do niezawodnej trwałej sesji.

Kluczowe zalety operacyjne:

  • Trwałość sesji po rozłączeniu — procesy przeżywają limity czasu SSH i przerwy w sieci
  • Multipleksowanie wielu okien — uruchamianie równoległych zadań w ramach jednego połączenia SSH
  • Niskie zużycie zasobów — znikome obciążenie CPU i pamięci w porównaniu z alternatywami opartymi na GUI
  • Skryptowalne zarządzanie sesjami — automatyzacja tworzenia sesji i wstrzykiwania poleceń za pomocą skryptów powłoki
  • Szeroka kompatybilność — dostępny praktycznie w każdym systemie zgodnym z POSIX

GNU Screen vs. tmux: Wybór odpowiedniego multipleksera

Oba narzędzia rozwiązują ten sam podstawowy problem, ale różnią się znacząco architekturą, głębokością konfiguracji i ergonomią skryptowania.

FunkcjaGNU Screentmux
Domyślna dostępnośćPreinstalowany w większości dystrybucjiWymaga jawnej instalacji
Plik konfiguracyjny`.screenrc``.tmux.conf`
Podział paneliPionowy i poziomy (ograniczony)Pełny podział paneli z układami
Skryptowanie / automatyzacjaWstrzykiwanie poleceń `screen -X``tmux send-keys`, bogaty API
Personalizacja paska stanuPodstawowaWysoce konfigurowalna
Tryb kopiowaniaPodobny do Vi, mniej intuicyjnyTryby Vi i Emacs, integracja ze schowkiem
Udostępnianie sesjiObsługiwane przez flagę `-x`Obsługiwane natywnie
Krzywa uczenia sięPłytkaUmiarkowana
Idealny przypadek użyciaSzybkie trwałe sesje, starsze systemyZłożone przepływy pracy z wieloma panelami

W przypadku prostej trwałości sesji na zdalnym serwerze — najczęstszego przypadku użycia administratora systemu — prostota Screen jest zaletą, a nie ograniczeniem.

Instalacja GNU Screen

Przed przystąpieniem do pracy sprawdź, czy Screen jest już zainstalowany:

“`bash

screen –version

“`

Jeśli nie jest zainstalowany, użyj odpowiedniego menedżera pakietów dla swojej dystrybucji.

Debian / Ubuntu:

“`bash

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

“`

CentOS / RHEL 7 i wcześniejsze:

“`bash

sudo yum install screen

“`

CentOS Stream / RHEL 8+ / Fedora:

“`bash

sudo dnf install screen

“`

Arch Linux:

“`bash

sudo pacman -S screen

“`

macOS (przez Homebrew):

“`bash

brew install screen

“`

Weryfikacja:

“`bash

screen –version

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

“`

Uruchamianie sesji Screen

Podstawowe uruchomienie sesji

“`bash

screen

“`

Przenosi cię do nowej sesji Screen ze standardowym znakiem zachęty powłoki. Sesja otrzymuje automatycznie numeryczny identyfikator oparty na PID.

Nazwane sesje (zdecydowanie zalecane)

Zawsze nadawaj nazwy sesjom w środowiskach produkcyjnych. Nazwane sesje są znacznie łatwiejsze do identyfikacji i ponownego podłączenia, gdy masz wiele równoległych zadań uruchomionych jednocześnie:

“`bash

screen -S session_name

“`

Praktyczne przykłady:

“`bash

screen -S db_migration

screen -S log_monitor

screen -S build_job

“`

Nadawanie nazw jest szczególnie cenne podczas zarządzania wieloma obciążeniami na serwerze dedykowanym, gdzie kilku administratorów może pracować jednocześnie.

Uruchamianie sesji z poleceniem

Możesz uruchomić Screen i natychmiast wykonać w nim polecenie:

“`bash

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

“`

Sesja trwa nawet po zakończeniu polecenia, umożliwiając ponowne podłączenie i sprawdzenie wyników.

Odłączanie od sesji Screen

Odłączanie to podstawowy przepływ pracy, który sprawia, że Screen jest wartościowy. Zawiesza widok sesji, pozostawiając wszystko w jej wnętrzu uruchomione.

Skrót klawiaturowy:

“`

Ctrl + A, then D

“`

  • `Ctrl + A` — prefiks polecenia Screen (wszystkie polecenia Screen zaczynają się od tego)
  • `D` — odłącz

Po odłączeniu terminal wraca do oryginalnego znaku zachęty powłoki. Sesja Screen i wszystkie procesy w niej zawarte nadal działają w tle. Zobaczysz komunikat potwierdzający:

“`

[detached from 12345.db_migration]

“`

Krytyczna pułapka: Nie mylić odłączania (`Ctrl+A, D`) z zamykaniem okna (`Ctrl+A, K` zabija bieżące okno). Zamknięcie wszystkich okien całkowicie kończy sesję.

Wyświetlanie aktywnych sesji Screen

“`bash

screen -ls

“`

Przykładowe wyjście:

“`

There are screens on:

18423.db_migration (Detached)

18891.log_monitor (Attached)

19204.build_job (Detached)

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

“`

Wskaźniki stanu mają znaczenie:

  • Detached — żaden terminal nie jest aktualnie podłączony; sesja działa w tle
  • Attached — terminal jest aktywnie podłączony do tej sesji
  • Dead — proces sesji zakończył się, ale plik gniazda nie został wyczyszczony (użyj `screen -wipe`, aby usunąć martwe sesje)

Ponowne podłączanie do sesji Screen

Ponowne podłączenie według nazwy sesji

“`bash

screen -r db_migration

“`

Ponowne podłączenie według PID sesji

“`bash

screen -r 18423

“`

Ponowne podłączenie gdy istnieje tylko jedna sesja

“`bash

screen -r

“`

Screen podłączy się automatycznie, jeśli istnieje tylko jedna odłączona sesja.

Wymuszone ponowne podłączenie do już podłączonej sesji

To scenariusz, który zaskakuje wielu administratorów. Jeśli połączenie SSH zostało przerwane w nieoczekiwany sposób, sesja może nadal wyświetlać się jako Attached, ponieważ poprzedni terminal nie odłączył się poprawnie. Próba standardowego `screen -r` zakończy się niepowodzeniem z komunikatem:

“`

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

There is no screen to be resumed.

“`

Rozwiązaniem jest wymuszone odłączenie starego terminala i natychmiastowe ponowne podłączenie:

“`bash

screen -d -r log_monitor

“`

  • `-d` — zdalne odłączenie sesji od terminala, który ją aktualnie zajmuje
  • `-r` — ponowne podłączenie do bieżącego terminala

Alternatywa z jawnym ID sesji:

“`bash

screen -d -r 18891

“`

Jest to jedno z najważniejszych operacyjnie poleceń Screen i jest często potrzebne po nieoczekiwanych rozłączeniach z VPS.

Zarządzanie wieloma oknami w sesji

Jedną z najpotężniejszych funkcji Screen jest możliwość uruchamiania wielu niezależnych okien (wirtualnych terminali) w ramach jednej sesji. Każde okno utrzymuje własną powłokę, drzewo procesów i bufor przewijania.

Tworzenie nowego okna

“`

Ctrl + A, then C

“`

Nawigacja między oknami

AkcjaSkrót
Następne okno`Ctrl + A, N`
Poprzednie okno`Ctrl + A, P`
Przejdź do okna według numeru`Ctrl + A, [0-9]`
Interaktywna lista okien`Ctrl + A, "`
Ostatnio aktywne okno`Ctrl + A, Ctrl + A`

Nadawanie nazwy oknu

“`

Ctrl + A, then A

“`

Zostaniesz poproszony o wprowadzenie nazwy dla bieżącego okna. Nazwane okna pojawiają się na liście okien i pasku stanu, co znacznie ułatwia nawigację przy uruchomieniu pięciu lub więcej równoległych zadań.

Zamykanie okna

Wpisz `exit` w powłoce lub naciśnij `Ctrl + D`. Gdy ostatnie okno w sesji zostanie zamknięte, sama sesja Screen kończy się.

Aby wymuszone zamknięcie bieżącego okna bez wychodzenia z powłoki:

“`

Ctrl + A, then K

“`

Podział ekranu (regiony)

GNU Screen obsługuje podstawowy podział terminala, który jest mniej elastyczny niż w tmux, ale funkcjonalny do monitorowania obok siebie.

Podział poziomy (góra/dół):

“`

Ctrl + A, then S

“`

Podział pionowy (lewo/prawo):

“`

Ctrl + A, then |

“`

Przeniesienie fokusu do następnego regionu:

“`

Ctrl + A, then Tab

“`

Usunięcie bieżącego regionu (bez zamykania okna):

“`

Ctrl + A, then X

“`

Usunięcie wszystkich regionów oprócz bieżącego:

“`

Ctrl + A, then Q

“`

Po podziale każdy region jest początkowo pusty. Przejdź do regionu za pomocą `Tab`, a następnie otwórz w nim okno używając `Ctrl + A, N` lub `Ctrl + A, "`.

Udostępnianie sesji Screen między wieloma użytkownikami

Screen obsługuje udostępnianie sesji wielu użytkownikom, co jest przydatne do wspólnego debugowania lub administracji parami. Wymaga to zainstalowania Screen z uprawnieniami setuid.

Włączenie trybu wielu użytkowników w sesji:

“`

Ctrl + A, then :multiuser on

“`

Przyznanie dostępu innemu użytkownikowi:

“`

Ctrl + A, then :acladd username

“`

Inny użytkownik może następnie podłączyć się do twojej sesji:

“`bash

screen -x your_username/session_name

“`

Uwaga dotycząca bezpieczeństwa: Sesje Screen dla wielu użytkowników wymagają starannej kontroli dostępu. Przyznawaj uprawnienia `acladd` tylko zaufanym kontom. W środowiskach hostingu współdzielonego ta funkcja jest zazwyczaj ograniczona.

Wysyłanie poleceń do odłączonej sesji

Jedną z niedocenianych możliwości Screen jest wstrzykiwanie poleceń do działającej sesji bez ponownego podłączania:

“`bash

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

“`

Polecenie `-X stuff` wysyła naciśnięcia klawiszy do sesji tak, jakby były wpisane. `n` symuluje naciśnięcie Enter. Jest to niezwykle przydatne w skryptach automatyzacji, które muszą wchodzić w interakcję z działającą sesją Screen.

Konfiguracja Screen za pomocą .screenrc

Plik `.screenrc` w katalogu domowym kontroluje domyślne zachowanie Screen. Minimalna, ale praktyczna konfiguracja:

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

“`

Ustawienie `defscrollback 10000` jest szczególnie ważne — domyślny bufor przewijania wynosi tylko 100 linii, co jest niewystarczające do monitorowania długo działających procesów.

Kompletny przewodnik po poleceniach Screen

Polecenie / SkrótFunkcja
`screen`Uruchom nową nienazwaną sesję
`screen -S name`Uruchom nazwaną sesję
`screen -ls`Wyświetl wszystkie sesje
`screen -r name`Ponownie podłącz do odłączonej sesji
`screen -d -r name`Wymuś odłączenie i ponowne podłączenie
`screen -x name`Podłącz do już podłączonej sesji (widok współdzielony)
`screen -wipe`Usuń martwe gniazda sesji
`Ctrl + A, D`Odłącz od bieżącej sesji
`Ctrl + A, C`Utwórz nowe okno
`Ctrl + A, N`Następne okno
`Ctrl + A, P`Poprzednie okno
`Ctrl + A, "`Interaktywna lista okien
`Ctrl + A, A`Zmień nazwę bieżącego okna
`Ctrl + A, K`Zamknij bieżące okno
`Ctrl + A, S`Podział poziomy
`Ctrl + A,`Podział pionowy
`Ctrl + A, Tab`Przejdź do następnego regionu
`Ctrl + A, Q`Usuń wszystkie regiony oprócz bieżącego
`Ctrl + A, [`Wejdź w tryb kopiowania/przewijania
`Ctrl + A, ?`Pokaż wszystkie skróty klawiaturowe
`Ctrl + A, :quit`Zakończ całą sesję

Rejestrowanie wyjścia sesji Screen

Screen może rejestrować wszystko wyświetlane w oknie do pliku — nieocenione przy audytowaniu długo działających zadań:

Przełącz rejestrowanie dla bieżącego okna:

“`

Ctrl + A, then H

“`

Tworzy to plik o nazwie `screenlog.N` (gdzie N to numer okna) w bieżącym katalogu. Możesz również włączyć rejestrowanie z wiersza poleceń podczas uruchamiania sesji:

“`bash

screen -L -S monitored_job

“`

Lub określić niestandardowy plik dziennika w `.screenrc`:

“`bash

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

“`

Praktyczne przypadki użycia na zdalnych serwerach

Długotrwałe migracje baz danych: Uruchom migrację w nazwanej sesji Screen, odłącz się i monitoruj postęp, okresowo ponownie się podłączając. Jeśli połączenie SSH zostanie przerwane, migracja kontynuuje się bez zakłóceń.

Ciągłe monitorowanie logów: Uruchom `tail -f` lub `multitail` w oknie Screen. Odłącz się i podłącz ponownie, gdy chcesz sprawdzić bieżący stan.

Zadania kompilacji: Duże kompilacje C++ lub jądra systemu mogą trwać godzinami. Screen zapewnia ukończenie kompilacji nawet jeśli laptop straci łączność.

Procesy interaktywne, których nie można uruchomić w tle: Niektóre narzędzia — CLI baz danych, interaktywne sesje Python, instalatory tekstowe — nie mogą być po prostu wysłane w tło za pomocą `&`. Screen opakowuje je w trwałą sesję w czysty sposób.

Koordynacja wielu administratorów: Używając `screen -x`, dwóch administratorów może obserwować tę samą sesję jednocześnie, co jest przydatne podczas reagowania na incydenty na serwerze dedykowanym.

Jeśli zarządzasz infrastrukturą webową wraz z trwałymi sesjami, połączenie Screen z dobrze skonfigurowanym VPS z cPanel zapewnia zarówno graficzny interfejs zarządzania, jak i pełne możliwości multipleksowania terminala. Dla zespołów zarządzających odnowieniami SSL i wdrożeniami certyfikatów przez wiersz poleceń, certyfikaty SSL w połączeniu ze skryptami automatyzacji opartymi na Screen mogą sprawić, że proces będzie w pełni bezobsługowy.

Typowe pułapki i jak ich unikać

Nagromadzenie osieroconych sesji: Administratorzy często zapominają o zakończeniu sesji po ukończeniu zadań. Regularnie uruchamiaj `screen -ls` i używaj `screen -wipe` do czyszczenia martwych gniazd. Zakończ bezczynne sesje za pomocą `screen -S session_name -X quit`.

Zbyt mały bufor przewijania: Domyślny bufor 100 linii oznacza szybką utratę historii wyjścia. Zawsze ustawiaj `defscrollback 10000` lub więcej w `.screenrc`.

Zagnieżdżone sesje Screen: Jeśli łączysz się przez SSH z wnętrza sesji Screen i uruchamiasz kolejną sesję Screen na zdalnym hoście, polecenia `Ctrl + A` będą przechwytywane przez zewnętrzną sesję. Użyj `Ctrl + A, A`, aby wysłać dosłowny `Ctrl + A` do wewnętrznej sesji, lub użyj `Ctrl + A, :sessionname` do rozróżnienia.

Sesja pozostaje w stanie Attached po rozłączeniu: Przerwane połączenie SSH może pozostawić sesję w stanie Attached. Zawsze używaj `screen -d -r` zamiast zwykłego `screen -r` podczas ponownego łączenia po nieoczekiwanym rozłączeniu.

Problemy z ustawieniami regionalnymi i kodowaniem: Jeśli widzisz zniekształcone znaki, upewnij się, że zarówno terminal, jak i Screen używają UTF-8. Dodaj `defutf8 on` do `.screenrc` i sprawdź, czy zmienna środowiskowa `LANG` jest ustawiona na ustawienia regionalne UTF-8 (np. `en_US.UTF-8`).

Macierz decyzyjna: Kiedy używać Screen

ScenariuszUżyć Screen?Uwagi
Długotrwały zdalny procesTakPodstawowy przypadek użycia
Jednorazowe szybkie polecenie SSHNieNarzut nieuzasadniony
Przepływ pracy z wieloma panelami terminalaMożeRozważ tmux dla złożonych układów
Współdzielona sesja debugowaniaTakUżyj `-x` dla widoku współdzielonego
Zautomatyzowany skrypt bez interakcjiNieUżyj `nohup` lub usługi `systemd`
Proces interaktywny, którego nie można zdemonizowaćTakScreen jest idealny
Trwały pulpit monitorowaniaTakPołącz z nazwanymi oknami i rejestrowaniem

Techniczna lista kontrolna kluczowych wniosków

  • Zawsze nadawaj nazwy sesjom za pomocą `screen -S descriptive_name` — nienazwane sesje stają się niemożliwe do zarządzania na dużą skalę
  • Ustaw `defscrollback 10000` w `.screenrc` zanim będziesz tego potrzebować, a nie po utracie wyjścia
  • Używaj `screen -d -r` jako domyślnego polecenia ponownego podłączenia, aby obsługiwać zarówno stany Attached, jak i Detached bez zastanowienia
  • Włącz rejestrowanie sesji za pomocą `screen -L` dla każdego zadania, którego wyjście może być potrzebne do późniejszego audytu
  • Regularnie uruchamiaj `screen -wipe`, aby usuwać martwe gniazda sesji i utrzymywać czytelność wyjścia `screen -ls`
  • Wstrzykuj polecenia do odłączonych sesji za pomocą `screen -X stuff`, aby automatyzować interakcję bez ponownego podłączania
  • W środowiskach wielu administratorów konfiguruj `.screenrc` z `multiuser on` i jawnymi listami ACL zamiast polegać na współdzielonym dostępie root
  • Testuj konfigurację `.screenrc` na systemie nieprodukcyjnym przed wdrożeniem jej na krytyczną infrastrukturę

Często zadawane pytania

Co dzieje się z sesją Screen po restarcie serwera?

Wszystkie sesje Screen są tracone po restarcie. Sesje Screen to procesy działające w pamięci — nie przeżywają restartu systemu. W przypadku naprawdę trwałych usług używaj plików jednostek `systemd` lub skryptów init. Screen służy do trwałości sesji interaktywnych po rozłączeniach, a nie po restartach.

Czy mogę używać Screen na koncie hostingu współdzielonego?

Standardowe środowiska hostingu współdzielonego zazwyczaj ograniczają dostęp SSH i mogą nie mieć zainstalowanego lub dostępnego Screen. Screen jest najbardziej efektywny w środowiskach VPS lub serwera dedykowanego, gdzie masz pełny dostęp do powłoki oraz uprawnienia root lub sudo.

Jaka jest różnica między `screen -r` a `screen -x`?

`screen -r` ponownie podłącza do sesji odłączonej, dając wyłączny dostęp. `screen -x` podłącza do sesji, która jest już podłączona, tworząc widok współdzielony, gdzie wiele terminali widzi tę samą sesję jednocześnie — przydatne do wspólnego rozwiązywania problemów.

Jak przewijać w górę w sesji Screen, aby zobaczyć poprzednie wyjście?

Wejdź w tryb kopiowania/przewijania za pomocą `Ctrl + A, [`. Użyj klawiszy strzałek lub Page Up/Page Down do nawigacji. Naciśnij `Escape` lub `Q`, aby wyjść z trybu kopiowania. Upewnij się, że bufor przewijania jest wystarczająco duży, ustawiając `defscrollback` w `.screenrc`.

Czy GNU Screen jest nadal aktywnie utrzymywany?

Tak. GNU Screen jest aktywnie utrzymywany w ramach projektu GNU. Wersja 4.9.x została wydana w 2022 roku. Choć nie otrzymuje tak szybkiego rozwoju funkcji jak tmux, otrzymuje poprawki bezpieczeństwa i poprawki błędów, co czyni go niezawodnym do użytku produkcyjnego na długo działającej infrastrukturze serwerowej.

15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij