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.
| Funkcja | GNU Screen | tmux |
|---|
| — | — | — |
|---|
| Domyślna dostępność | Preinstalowany w większości dystrybucji | Wymaga jawnej instalacji |
|---|
| Plik konfiguracyjny | `.screenrc` | `.tmux.conf` |
|---|
| Podział paneli | Pionowy i poziomy (ograniczony) | Pełny podział paneli z układami |
|---|
| Skryptowanie / automatyzacja | Wstrzykiwanie poleceń `screen -X` | `tmux send-keys`, bogaty API |
|---|
| Personalizacja paska stanu | Podstawowa | Wysoce konfigurowalna |
|---|
| Tryb kopiowania | Podobny do Vi, mniej intuicyjny | Tryby Vi i Emacs, integracja ze schowkiem |
|---|
| Udostępnianie sesji | Obsługiwane przez flagę `-x` | Obsługiwane natywnie |
|---|
| Krzywa uczenia się | Płytka | Umiarkowana |
|---|
| Idealny przypadek użycia | Szybkie trwałe sesje, starsze systemy | Zł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
| Akcja | Skró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ót | Funkcja |
|---|
| — | — |
|---|
| `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
| Scenariusz | Użyć Screen? | Uwagi |
|---|
| — | — | — |
|---|
| Długotrwały zdalny proces | Tak | Podstawowy przypadek użycia |
|---|
| Jednorazowe szybkie polecenie SSH | Nie | Narzut nieuzasadniony |
|---|
| Przepływ pracy z wieloma panelami terminala | Może | Rozważ tmux dla złożonych układów |
|---|
| Współdzielona sesja debugowania | Tak | Użyj `-x` dla widoku współdzielonego |
|---|
| Zautomatyzowany skrypt bez interakcji | Nie | Użyj `nohup` lub usługi `systemd` |
|---|
| Proces interaktywny, którego nie można zdemonizować | Tak | Screen jest idealny |
|---|
| Trwały pulpit monitorowania | Tak | Połą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.
