Przejdź do treści
Lekcja 18 z 117

Kurs › Moduł 1 › Lekcja 18

tmux: terminal, który przeżyje rozłączenie

⏱ ok. 10 min czytania· moduł 1: Praca w powłoce

Po tej lekcji: kursant odpala długie prace na serwerze w tmux, odłącza się i wraca do sesji, używa okien i paneli, wie, czemu proces bez tmux ginie po zerwaniu połączenia, i umie to samo w screen.

Wstęp

SSH do serwera, sudo apt upgrade na 63 procentach, laptop przechodzi na baterii w uśpienie, wraca: client_loop: send disconnect: Broken pipe

Aktualizujesz serwer przez SSH. Trwa to dwadzieścia minut. W piętnastej minucie Wi-Fi w pociągu robi to, co Wi-Fi w pociągu robi najlepiej. Logujesz się z powrotem i nie wiesz: aktualizacja się skończyła? Przerwała w połowie? Zostawiła system w stanie „połówka starego, połówka nowego”?

Doświadczeni admini mają na to jedną zasadę: wszystko, co trwa dłużej niż kawę, odpalaj w tmux. Po tej lekcji będziesz wiedział czemu, a zerwane połączenie stanie się drobną niedogodnością zamiast katastrofy.

Czemu proces ginie razem z połączeniem

Kiedy łączysz się przez SSH, Twój Bash jest dzieckiem tego połączenia, a apt upgrade jest dzieckiem Basha. Jak połączenie pada, Bash dostaje sygnał SIGHUP, od „hang up”, czyli „rozłączono”. Nazwa z czasów, kiedy do komputerów dzwoniło się modemem i dosłownie odkładało słuchawkę.

Dokumentacja Basha mówi wprost: powłoka po otrzymaniu SIGHUP domyślnie kończy pracę, a powłoka interaktywna przed wyjściem przesyła SIGHUP do wszystkich swoich zadań. Czyli: rozmowa w urzędzie się zerwała, urzędnik uznaje sprawę za zamkniętą i wyrzuca do kosza wszystkie wnioski, które były w trakcie. Sprawdziłem to: w terminalu działało sleep 777, wysłałem SIGHUP do Basha i po sekundzie po sleep nie było śladu.

Potrzebujemy więc urzędnika, który nie siedzi przy Twoim telefonie, tylko we własnym biurze, i pracuje dalej, kiedy Ty się rozłączysz.

tmux: studio, które nadaje dalej

Wyobraź sobie telewizor i studio telewizyjne. Wyłączasz telewizor, a program w studiu leci dalej. Włączasz go jutro, w innym pokoju, i trafiasz dokładnie tam, gdzie program jest teraz.

tmux, od „terminal multiplexer”, działa właśnie tak. Studio to serwer tmux, proces, który działa na maszynie i trzyma Twoje powłoki. Telewizor to klient, czyli to, co widzisz w terminalu. Zerwane SSH wyłącza telewizor. Studio nawet tego nie zauważa.

Instalacja:

sudo apt install tmux     # [Ubuntu]
sudo dnf install tmux     # [RHEL]
tmux -V
tmux 3.4

[RHEL] Na Red Hacie tmux to oficjalnie zalecane narzędzie. Starszy screen został oznaczony jako przestarzały w RHEL 7.6 i nie ma go w RHEL od wersji 8. Można go doinstalować z repozytorium EPEL, ale Red Hat stawia na tmux.

Sesje: new, odlaczenie, ls, attach

Nowa sesja z nazwą:

tmux new -s praca

Ekran się czyści, na dole pojawia się zielony pasek z nazwą sesji. W środku zwykły Bash, robisz w nim, co chcesz. Na przykład coś długiego:

sudo apt upgrade

I teraz najważniejszy skrót w tej lekcji. tmux słucha komend po specjalnym klawiszu, który nazywa się prefiks. Domyślnie to Ctrl+B. Wciskasz Ctrl+B, puszczasz, potem d. Ctrl+B, puść, d. Jak „proszę pana” przed wnioskiem w urzędzie: dopiero po tym tmux wie, że mówisz do niego, a nie do programu w środku.

d to detach, odłącz. Wracasz do zwykłego terminala, a na dole widzisz [detached (from session praca)]. Aktualizacja leci dalej. Możesz się wylogować, zamknąć laptop, pójść na obiad.

Wracasz. Lista sesji:

tmux ls
druga: 1 windows (created Tue Nov  3 22:22:21 2026)
praca: 1 windows (created Tue Nov  3 22:22:21 2026) (attached)

To (attached) przy sesji znaczy, że jakiś terminal na nią teraz patrzy. Brak dopisku: sesja działa sama, czeka na Ciebie. Podłączenie:

tmux attach -t praca

I jesteś dokładnie tam, gdzie byłeś, z całym wynikiem na ekranie, jakby nic się nie stało. Krócej można tmux a -t praca, a samo tmux a podłącza do ostatniej sesji. Sesję zamykasz, wpisując w niej exit, albo z zewnątrz tmux kill-session -t praca.

Co ciekawe, do jednej sesji może się podłączyć dwóch ludzi naraz i widzą to samo. Admini używają tego do pokazywania koledze na żywo, co robią na serwerze. Taki zdalny pulpit dla ludzi, którzy nie uznają myszki.

Okna: zakładki w jednej sesji

W jednej sesji możesz mieć kilka okien, jak zakładki w przeglądarce. W jednym logi, w drugim edytor, w trzecim top.

  • Ctrl+B c — nowe okno, od create
  • Ctrl+B n / Ctrl+B p — następne, poprzednie
  • Ctrl+B 0…9 — skok do okna o numerze
  • Ctrl+B w — lista okien do wybrania strzałkami
  • Ctrl+B , — zmiana nazwy okna
  • Ctrl+B & — zamknięcie okna, tmux zapyta kill-window ...? (y/n)

Na dolnym pasku widać listę okien, a gwiazdka oznacza to, w którym jesteś. Z zewnątrz wygląda to tak:

tmux list-windows -t praca
0: zsh- (1 panes) [120x30] [layout a8fd,120x30,0,0,0] @0
1: zsh* (2 panes) [120x30] [layout f0a4,120x30,0,0{60x30,0,0,2,59x30,61,0,3}] @2 (active)

U mnie w nazwie okien jest zsh, bo tak była ustawiona powłoka na tej maszynie. U Ciebie będzie bash albo nazwa programu, który w oknie działa.

Panele: dzielenie ekranu

Okno da się też pokroić na kawałki, jak pizzę. Każdy kawałek to panel z własnym Bashem.

  • Ctrl+B % — podział na lewy i prawy
  • Ctrl+B " — podział na górny i dolny
  • Ctrl+B strzałka — przejście do panelu w danym kierunku, Ctrl+B o do następnego
  • Ctrl+B z — zoom: panel na cały ekran i z powrotem
  • Ctrl+B x — zamknięcie panelu, z pytaniem kill-pane ...? (y/n)

Klasyczny układ admina przy wdrażaniu: po lewej edytujesz konfigurację, po prawej na żywo lecą logi. Zmieniasz, zapisujesz, od razu widzisz, co się stało. Jak kucharz, który jednym okiem patrzy na przepis, a drugim na garnek.

I jeszcze jedno: w tmux kółko myszy domyślnie nie przewija historii. Żeby przewinąć, wchodzisz w tryb kopiowania Ctrl+B [, przewijasz strzałkami albo PageUp, a wychodzisz klawiszem q. A jeśli zapomnisz któregoś skrótu, Ctrl+B ? pokazuje listę wszystkich. To jedyny skrót, który naprawdę trzeba zapamiętać.

Ustawienia w ~/.tmux.conf

tmux czyta przy starcie plik ~/.tmux.conf. Trzy linijki, które wiele osób dodaje od razu:

set -g mouse on
set -g history-limit 50000
set -g base-index 1

Pierwsza włącza myszkę: klikasz w panel, przewijasz kółkiem, przeciągasz granice paneli. Druga pozwala przewinąć do 50 tysięcy linijek wstecz, domyślnie jest 2000. Trzecia numeruje okna od 1, a nie od 0, bo klawisz 0 jest na drugim końcu klawiatury. Sprawdzenie, czy tmux to wczytał:

tmux show -g mouse
tmux show -g history-limit
mouse on
history-limit 50000

Plik czyta serwer tmux przy starcie. Jeśli serwer już działa, zmiany załaduje tmux source-file ~/.tmux.conf.

Jak to działa pod spodem

Kiedy wpisujesz pierwsze tmux, startują dwa procesy: serwer i klient. Serwer odcina się od Twojego terminala i działa sam, a jego dzieckiem jest Bash z sesji. Widać to w drzewku procesów:

ps -ef --forest
eryk     24286     1  0 21:24 ?        00:00:00 tmux new -d -s praca
eryk     24287 24286  0 21:24 pts/0    00:00:00  \_ -bash
eryk     24303 24287  0 21:24 pts/0    00:00:00      \_ top

Trzecia kolumna to numer rodzica. Serwer tmux ma tam 1, czyli na zwykłym serwerze kierownika zmiany, systemd, a nie Twoje połączenie SSH. Zerwane SSH zabija klienta, telewizor, ale serwer, studio, nie ma z tym połączeniem nic wspólnego. Bash w sesji nie dostaje SIGHUP, bo jego terminalem nie jest Twoje SSH, tylko wirtualny terminal, który trzyma tmux.

Klient z serwerem rozmawiają przez gniazdo, specjalny plik w /tmp/tmux-NUMER_UŻYTKOWNIKA/default. Dlatego każdy użytkownik ma swoje sesje i nie widzi cudzych. A gdy zamkniesz ostatnią sesję, serwer kończy pracę sam.

screen: starszy kuzyn

Na starych serwerach znajdziesz zamiast tmux program screen, GNU Screen. Robi to samo, tylko inaczej się go obsługuje. Prefiks to Ctrl+A.

screen -S kopia

W środku odpalasz, co trzeba, a odłączasz się przez Ctrl+A d.

screen -ls
There is a screen on:
	23528.kopia	(11/03/26 22:22:12)	(Detached)
1 Socket in /run/screen/S-root.

Powrót przez screen -r kopia. Jeśli sesja wisi jako (Attached), bo poprzednie połączenie umarło, zanim screen to zauważył, użyj screen -d -r kopia: odłącz tamto i podłącz tutaj. Nowe okno to Ctrl+A c, przełączanie Ctrl+A n.

Który wybrać? Na swoich serwerach tmux. screen warto umieć na tyle, żeby przyłączyć się do czyjejś sesji na starym systemie i nie panikować. Jak z kierownicą w starym maluchu: na co dzień nie musisz, ale dobrze wiedzieć, gdzie jest ssanie.

Ściąga flag

KomendaFlagaCo robi
tmuxnew -s nazwanowa sesja z nazwą
tmuxlslista sesji
tmuxattach -t nazwa (a -t)podłączenie do sesji
tmuxkill-session -t nazwazamknięcie sesji
tmuxshow -g opcjaaktualna wartość ustawienia
tmuxsource-file ~/.tmux.confwczytanie ustawień bez restartu
tmuxCtrl+B dodłączenie (detach)
tmuxCtrl+B c / n / p / wnowe okno / następne / poprzednie / lista
tmuxCtrl+B % / "podział na panele: lewo-prawo / góra-dół
tmuxCtrl+B strzałka / z / xprzejście / zoom / zamknięcie panelu
tmuxCtrl+B [przewijanie historii, wyjście q
tmuxCtrl+B ?lista wszystkich skrótów
screen-S nazwanowa sesja z nazwą
screen-lslista sesji
screen-r nazwapowrót do sesji
screen-d -r nazwaodbij sesję z innego terminala i podłącz tutaj
screenCtrl+A dodłączenie

⚠ Typowy błąd

tmux w tmuxie.

Pracujesz w sesji, zapominasz o tym i wpisujesz tmux new -s druga:

sessions should be nested with care, unset $TMUX to force

tmux wie, że już w nim jesteś, bo ustawia w sesji zmienną środowiskową TMUX, znasz je z poprzedniej lekcji. Telewizor w telewizorze, który pokazuje telewizor. Da się, ale wtedy Ctrl+B trafia do zewnętrznego tmux i nic nie działa tak, jak chcesz. Rozwiązanie: nie zakładaj nowej sesji ze środka, tylko odłącz się Ctrl+B d i załóż ją z zewnątrz. Albo przełącz się między sesjami bez wychodzenia: Ctrl+B s pokazuje listę sesji do wybrania.

Drugi błąd, częsty rano po restarcie:

tmux ls
tmux attach -t praca
no server running on /tmp/tmux-30042/default
no sessions

Liczba w ścieżce to numer użytkownika, u Ciebie pewnie 1000.

Serwer tmux nie działa, więc nie ma żadnych sesji. Najczęściej maszyna była w nocy restartowana, bo tmux, jak już mówiłem, restartu nie przeżywa. Albo próbujesz podłączyć się jako inny użytkownik niż ten, który sesję zakładał, na przykład przez sudo. Każdy użytkownik ma własne gniazdo, więc root nie widzi sesji Eryka.

✎ Zadanie

Otwórz sesję tmux o nazwie praca, uruchom w niej top, odłącz się, wypisz listę sesji, wróć do sesji, a potem w drugim oknie tmux znajdź numer PID tego top.

Pokaż rozwiązanie
tmux new -s praca
top
# Ctrl+B, potem D — odłączamy się
tmux ls
tmux attach -t praca
# Ctrl+B, potem C — nowe okno w tej samej sesji
pgrep -a top
ps -C top -o pid,ppid,tty,cmd

Po odłączeniu tmux ls pokazuje, że sesja żyje dalej:

praca: 1 windows (created Tue Nov  3 16:25:21 2026)

A w drugim oknie:

3550 top
  PID  PPID TT       CMD
 3550  3537 pts/0    top

top przez cały czas Twojej nieobecności pracował dalej. Jak pracownik, który nie zauważył, że szef wyszedł do domu. Numer 3550 to PID tego top. A czym jest ten numer i skąd się wziął ten drugi, 3537? Właśnie po to jest dzisiejsza lekcja.

Co dalej

W zadaniu pierwszy raz trafiasz na numer PID. W następnej lekcji zaczynamy moduł o procesach: czym program różni się od procesu, skąd biorą się PID i PPID, jak czytać ps aux kolumna po kolumnie i co każdy proces trzyma w swoim folderze w /proc.