2021-12-06 / Bartłomiej Kurek
tmuxp: wygodne sesje w terminalu

Czym jest tmux?

Tmux to program umożliwiający wygodną pracę z wieloma oknami/buforami/sesjami w terminalu. Jest to alternatywa dla programu GNU Screen. Sam tmux pochodzi z systemu OpenBSD. Narzędzie to pozwala m.in:
- wygodnie tworzyć/dzielić/przenosić okna i bufory w jednym oknie terminalowym
- zostawić działającą sesję na serwerze po wylogowaniu
- współdzielić jeden terminal przez różne sesje tego samego użytkownika (wygodne przy wspólnej nauce na zdalnym serwerze)

Instalacja tmux w Debian i pochodnych:

sudo apt install tmux

Do czego to jest przydatne?

Jeśli pracujemy często w terminalu lub na serwerach, to nie chcemy być ograniczeni do jednego bufora w terminalu, lub chcemy wylogować się z serwera pozostawiając sesję bez przerywania uruchomionych w niej programów. Dodatkowo praca w multiplekserze terminalowym takim jak tmux zabezpiecza nas w przypadku utraty połączenia sieciowego. Jeśli na serwerze wydamy komendę, która długo działa, to utrata połączenia sieciowego spowodowałaby przerwanie jej działania. Przerwaną komendę możemy zazwyczaj wznowić, ale bywają komendy, których nie chcemy "przypadkiem" przerwać (np. uruchomienie skryptów migracyjnych bazy danych). Narzędzia takie jak tmux i screen pozwalają na odłączenie i podłączenie się do sesji, a przypadkowa utrata połączenia sieciowego nie przerwie samej sesji terminala ani programów w niej uruchomionych. Po ponownym zalogowaniu się do serwera możemy podłączyć się do wciąż działającej sesji i kontynuować pracę.

Podstawowe skróty klawiszowe

Tmux wykorzystuje skróty łańcuchowe, tzn. że najpierw wciskamy klawisze odpowiadające prefiksowi (domyślnie ctrl+b), a następnie klawisz odpowiadający żądanej akcji.

Przykładowo:
- Ctrl+b n powoduje przejście do następnego okna (next)
- Ctrl+b p wywołuje przejście do poprzedniego okna (prev)
- Ctrl+b c tworzy nowe okno (create)
- Ctrl+b k usuwa aktualne okno (kill)

  • Ctrl+b " dzieli panel w poziomie
  • Ctrl+b % dzieli panel w pionie

Pomiędzy panelami możemy nawigować przez Ctrl+b Up, Ctrl+b Down, itd. Zachęcam do zapoznania się z dokumentacją. Jeśli z jakiegoś powodu znajdziemy się w zagnieżdżonych sesjach tmux, to komendę poprzedzamy wielokrotnością skrótu prefiksu, np. (Ctrl+b Ctrl+b c) spowoduje stworzenie nowego okna w zagnieżdżonej instancji.

Listę skrótów klawiszowych znajdziemy:
- już wewnątrz sesji tmux (Ctrl+b ?)
- w dokumentacji (man tmux)
- w internecie, np. https://tmuxcheatsheet.com

Video (nowa sesja tmux)

Krótkie video, w którym:
uruchamiam nową sesję tmux
- w sesji uruchamiam dwie sesje bash (program top, program watch)
- odłączam się od sesji (programy nie przestają działać)
- wracam do sesji
- wyłączam oba uruchomione programy, co powoduje zakończenie sesji tmux

Video: WebM, 414K, 1280x720, Duration: 00:00:30. Link

Czym jest tmuxp?

tmuxp to narzędzie stworzone w Python, które pozwala nam na konfigurację i zapis ustawień dla sesji tmux. Konfigurację taką możemy załadować i w wyniku otrzymamy żądany układ okien, zakładek, czy też uruchomionych na starcie sesji programów. Tmuxp pozwala "zamrozić" aktualnie uruchomioną sesję, ale własną konfigurację możemy też łatwo stworzyć z gotowych przykładów zamieszczonych w dokumentacji. Konfiguracje możemy zapisywać w formacie YAML lub JSON.
Tmuxp możemy zainstalować przy pomocy instalatora pakietów python: pip.

pip install tmuxp

Przykład konfiguracji sesji (tmuxp)

Nie będę przytaczał tutaj dokumentacji, a jako przykład pokażę własną konfigurację sesji tmuxp, której używam podczas pracy nad codeasap.pl. Konfiguracja ta jest w formacie JSON, a zawiera:

  • nazwę sesji "codeasap"
  • sekcję environment, w której mozna zamieścić zmienne środowiskowe dla całej sesji
  • konfigurację dwóch osobnych okien
  • pierwsze okno uruchamia środowisko codeasap.pl w wersji deweloperskiej (3 panele)
  • drugie okno uruchamia skrypt obserwujący katalog bloga i automatycznie przebudowujący treść po dowolnej zmianie

Plik: tmuxp.json

{
    "session_name": "codeasap",
    "environment": {},
    "windows": [
        {
            "window_name": "RUN",
            "layout": "tiled",
            "shell_command_before": ["test -d .venv && source .venv/bin/activate"],
            "focus": true,
            "panes": [
                {"shell_command": ["make build; ./mgr.py run -m development -F redis mqtasks"]},
                {"shell_command": ["watch -n 2 qa/monitor.sh"]},
                {"shell_command": ["./manage run"]}
            ]
        },
        {
            "window_name": "BLOG",
            "layout": "tiled",
            "panes": [
                {"shell_command": ["cd blog && ./watch.sh"]}
            ]
        }
    ]
}

Pierwsze okno otrzymuje nazwę "RUN", aktywuje środowisko wirtualne python (jeśli istnieje).
Okno "RUN" podzielone jest na 3 części, w których następuje:
1. uruchomienie budowania kontenerów docker (make build), uruchomienie kontenerów redis, mqtasks (skrypt mgr.py)
2. uruchomienie programu watch, który co 2 sekundy wyświetla wynik skryptu qa/monitor.sh
3. uruchomienie aplikacji Python (skrypt manage)

Tak skonfigurowaną sesję można uruchomić po prostu przez:

tmuxp load tmuxp.json

Video (tmuxp)

W tym krótkim materiale demonstruję uruchomienie własnej aplikacji w środowisku deweloperskim w jednej sesji tmux. Komendę startową umieściłem w pliku Makefile, więc w celu uruchomienia całości wpisuję po prostu make run. Makefile zawiera również target stop, a zatem już wewnątrz sesji tmux używam komendy make stop do zatrzymania całości (zostają zatrzymane kontenery docker, a następnie wywoływana jest komenda tmux kill-session -t codeasap.

Video: WebM, 3.2M, 1920x1080. Duration: 00:01:18 Link

Wiele sesji, nawigacja

Tmux (oraz tmuxp) bardzo dobrze sprawdza się w pracy w sesjach zdalnych i lokalnych. Tmux pozwala również na wygodne przechodzenie pomiędzy sesjami/oknami/buforami, co bardzo ułatwia organizację pracy i nawigację pomiędzy wieloma projektami. Same instancje tmux możemy również zagnieżdżać (przykładowo: w naszej sesji tmux jesteśmy podłączeni do zdalnej maszyny, na której również uruchamiamy tmux).
Na koniec krótka demonstracja nawigacji pomiędzy uruchomionymi sesjami.

Video: WebM, 4.6M, 1920x1080. Duration: 00:03:06 Link

Podsumowanie

Tmux to bardzo dobre narzędzie usprawniające codzienną pracę. Jest w całości sterowany klawiaturą i wysoce konfigurowalny. Można przystosować go do własnych upodobań, kolorystyki, czy wygodnych skrótów klawiszowych. Zapewne komuś, kto pierwszy raz ma styczność z takim narzędziem, może wydać sie nieco dziwny, jednak nauka wprawnego posługiwania się nim przychodzi bardzo szybko, gdyż to zaledwie kilka skrótów klawiszowych, a nawigacja jest bardzo intuicyjna. Funkcjonalność tego programu dalece wykracza poza przedstawione przeze mnie zagadnienia. Można przenosić okna, zmieniać rozmiary paneli, rozbijać panele na nowe okna, czy skonfigurować oznaczenia róznych notyfikacji wizualnych (np. o zakończeniu powodzeniem/niepowodzeniem programu działającego w danym oknie). Konfiguracja tmux zawiera się w jednym pliku tekstowym, a tmuxp umożliwia dostosowanie sesji do każdego projektu osobno. Zdecydowanie zachęcam do poświęcenia chwili i zapoznania się z tym programem.

Moja konfiguracja (tmux.conf)

Mój plik konfiguracyjny tmux (tmux.conf) można znaleźć w repozytorium (GitHub).
Ja dla wygody przemapowałem domyślny skrót prefiksu na Ctrl+v, gdyż Ctrl+b w terminalu zwyczajowo oznacza przesunięcie kursora na poprzedni znak (backwards).