tmux: terminal, który przeżyje rozłączenie
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 -Vtmux 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 pracaEkran 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 upgradeI 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 lsdruga: 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 pracaI 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 praca0: 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 1Pierwsza 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-limitmouse on
history-limit 50000Plik 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 --foresteryk 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 \_ topTrzecia 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 kopiaW środku odpalasz, co trzeba, a odłączasz się przez Ctrl+A d.
screen -lsThere 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
| Komenda | Flaga | Co robi |
|---|---|---|
tmux | new -s nazwa | nowa sesja z nazwą |
tmux | ls | lista sesji |
tmux | attach -t nazwa (a -t) | podłączenie do sesji |
tmux | kill-session -t nazwa | zamknięcie sesji |
tmux | show -g opcja | aktualna wartość ustawienia |
tmux | source-file ~/.tmux.conf | wczytanie ustawień bez restartu |
| tmux | Ctrl+B d | odłączenie (detach) |
| tmux | Ctrl+B c / n / p / w | nowe okno / następne / poprzednie / lista |
| tmux | Ctrl+B % / " | podział na panele: lewo-prawo / góra-dół |
| tmux | Ctrl+B strzałka / z / x | przejście / zoom / zamknięcie panelu |
| tmux | Ctrl+B [ | przewijanie historii, wyjście q |
| tmux | Ctrl+B ? | lista wszystkich skrótów |
screen | -S nazwa | nowa sesja z nazwą |
screen | -ls | lista sesji |
screen | -r nazwa | powrót do sesji |
screen | -d -r nazwa | odbij sesję z innego terminala i podłącz tutaj |
| screen | Ctrl+A d | odłą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 forcetmux 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 pracano server running on /tmp/tmux-30042/default
no sessionsLiczba 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,cmdPo 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 toptop 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.