Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Terminal Ninja - co zabrać ze sobą do Dojo - TMUX

Od jakiegoś czasu wzmożenie używam konsoli. Postanowiłem, że gdzie to tylko możliwe
będę używał tego sposobu interakcji z komputerami. Często jest
to wyzwanie, które utrudnia realizację pewnych zadań, jednak
nagroda jest nie byle jaka – odznaka hakera wycięta z buraka!
Coś co GUI mogłem zrobić kilkoma kliknięciami tu przysparza
czasem nie lada problemów.Jednak jest w tym coś magicznego, w
pewien sposób staje się bliższy problemom, które te całe
oprogramowanie zainstalowane na maszynach próbuje za nas
rozwiązać. Po jakimś czasie te same zadania udaje mi się robić
tak samo szybko lub nawet szybciej niż w środowisku graficznym,
kwestia treningu. Poza tym co byś nie robił w konsoli zawsze dla
laika wygląda poważnie, choćbyś pingował loopbacka stwierdzenie
„jestem zajęty” nabiera szczególnej mocy, gdy na monitorze 
pojawiają się te tajemnicze znaki. Jest jeszcze jedna rzecz, która
mnie w tym zauroczyła- tu na dole blisko CLI widać doskonale jak
dobre narzędzia mogą znacznie ułatwić realizowanie zadań. Są
takie programy, bez których po pewnym czasie nie sposób wyobrazić
sobie pracy i próbujesz sobie przypomnieć jak mogłeś w ogóle żyć
bez stosowania tego rozwiązania.

Jednym takich nieocenionych narzędzi jest tmux. By o nim opowiedzieć jest nie
lada okazja – w końcu niedawno skończył 10 lat.

r   e   k   l   a   m   a

Co to właściwe jest ten tmux?

Tmux jest multiplekserem terminali (ang. terminal multiplexer), programem który
zarządza wirtualnymi terminalami (pseudo terminalami?), potrafi
zarządzać przestrzenią roboczą wewnątrz sesji, otwierać kolejne
okna i dzielić je na kolejne przestrzenie. Gdy przyjdzie taka
potrzeba programy mogą się wykonywać dalej w uśpionej sesji,
nawet gdy wyłączymy okno lub rozłączymy sesję ssh. W praktyce
oznacza to, że można wykonywać pewną pracę na zdalnej maszynie
(lub lokalnej), po czym kontynuować ją po zalogowaniu się przez
ssh z innego urządzenia lub kontynuować ją po pewnym czasie.

Jak to działa?

Najpierw oczywiście trzeba go zainstalować, na pewno jest on
dostępny w menadżerze pakietów w twojej dystrybucji.

Absolutne podstawy

Jak zacząć ? Nic prostszego, wykonujemy polecenie

tmux

Naszą obecność w sesji tmuxa można poznać po pasku w dolnej części terminala,
wewnątrz nawiasu kwadratowego mamy nazwę sesji, dalej mamy numer
okna oraz nazwę aktywnego programu wewnątrz okna. W sesji możemy
robić dokładnie to samo co w termianu. Spróbujmy np. wydać
polecenie ping

Przenieś w górę

Jeżeli jednak chcemy wydać polecenie tmuxowi musimy je poprzedzić kompilacją
klawiszy ctrl + b. Spróbujmy więc uśpić sesję

crtl + b d

I już jesteśmy z powrotem w tradycyjnym terminalu, możemy powrócić do swoich
wcześniejszych zajęć, jeżeli jednak będziemy chcieli powrócić
do sesji tmuxa wystarczy wydać polecenie

tmux attach-session

Jak możemy zaobserwować wewnątrz sesji- ping cały czas się wykonywał. Zabijamy
sesję wpisując w terminalu wewnątrz sesji tmuxa

exit

lub możemy też ją
zabić z poziomu terminalu na zewnątrz sesji (wcześniej wychodząc
z niej crtl + b d)

tmux kill-session

Jeżeli nie pasjonuje cie praca w konsoli możesz właściwe w tym miejscu
przestać czytać, to w zupełności wystarczy żeby od święta coś
podziałać. Możesz zostawiając jakiś program uruchomiony tle,
spokojnie zamknąć terminal i cieszyć się pięknym pulpitem z
świadomością, że program pracuje w dalej.



Jeszcze więcej sesji !

Możemy mieć uruchomianą więcej niż jedną sesję! Oczywiście można zrobić tak jak powyżej, ale warto je opisać tak żeby łatwiej było je odróżnić, możemy nadać nasze sesji nazwę.

tmux new -t nazwa

Możemy zaobserwować, iż w lewym dolny rogu pojawiła się nazwa sesji, numerem po myślniku jest numer sesji. Żeby dołączyć do sesji o konkretniej nazwie wydajemy polecenie

tmux attach-session -t nazwa

Mamy kilka sesji warto je sobie wylistować, łatwiej będzie podjąć decyzję, do której sesji się podłączyć

tmux ls

Jeżeli jesteśmy wewnątrz tmuxa możemy też przywołać bardzo zgrabne menu, które pomoże nam przełączać się pomiędzy sesjami, dla ułatwienia mamy na dolnej części ekranu podgląd zawartości.

crtl+b s

Wybraną sesję możemy zabić jeżeli nie będzie nam już potrzebna

tmux kill-session -t nazwa

z mniej spektakularnych opcji możemy zmienić sesji nazwę

<cod> crtl+b $


Okien nigdy za dużo!

Czasami chcielibyśmy zrobić kilka rzeczy naraz, terminal ma taką
przywarę, że nie można go używać gdy wykonuje się w nim jakiś
proces, gdy np. kompilujesz program może to zająć sporo czasu, nie
warto go marnować lepiej się zająć innymi zadaniami.
Możemy przełączyć się na drugi terminal, gdy chcemy pracować na
komputerze zdalnym tam uruchomić ssh, jest to jakiś sposób. Tmux
jednak i to ułatwia, możemy otworzyć nowe okno wewnątrz sesji
tmuxa!

crtl+b c

Na dole dodatkowe okno oznaczone numerem 1, po numerze występuje
zazwyczaj nazwa programu, który aktualnie w nim działa. Możemy
przejść do następnego okna za pomocą

crtl+b n

do okna poprzedniego

crtl+b p

lub do wybranego okna

crtl+b numer

Czasem przyda się zmienić nawę okna dla swojej wygody, może być
to przydatne w scenariuszu gdy logujesz się na serwer po dłuższym
czasie nazwy mogą dać odpowiedni kontekst i przypomnieć nam co tu
chcieliśmy osiągnąć. Po wprowadzeniu wydaniu polecania tmuxowi w
dole ekranu pojawi się pomarańczowy pasek komend gdzie wprowadzamy
nową nazwę.

crtl+b ,

Jeżeli mamy już kilka okien może być na trudno między nimi
nawigować, dobrym pomysłem jest wylistowanie sobie ich wszystkich.
Jest to o tyle ciekawa opcja gdyż na dole ekranu mamy podgląd
widoku całego okna!

crtl + b w

z mniej spektakularnych opcji możemy wyszukać okno po nazwie

crtl+b f

po prostu je zamknąć

crtl+b &

lub przenieść do innej sesji

crtl+b . nazwa-sesji

 
Tiling terminal

To jest jedna z moich ulubionych funkcji i zdaje sobie sprawę, że nie każdemu to przypadnie do gustu. Od dłuższego czasu sam używam tiling windows menagera (odsyłam do poprzedniego wpisu), więc ten sposób zarządzania przestrzenią jest dla mnie naturalny i intuicyjny. Jeżeli ktoś tego nie czuje proponuje poprzestać na oknach :) Możemy podzielić okno powstaną wtedy dwie niezależne przestrzenie, w terminologii tmuxa szyby (ang. panes), które pracują niezależnie od siebie. Podzielić w pionie możemy przez komendę

crtl+b %

natomiast podział w poziomie osiągamy przez

crtl+b „

Do przemieszczania się między przestrzeniami służą strzałki poprzedzone prefixem crtl+b. Każda szyba ma swój numer, crtl+b q wyświetli nam te numery. Jeżeli chcemy szybko zmienić aktywną szybę w momencie wyświetlania numerów wystarczy, że naciśniemy numer na który chcemy się przenieść

crtl+b q

Każdą szybę możemy przesunąć o jedną pozycję (numer) wyżej lub niżej za pomocą { oraz }. Zarządzanie oknami jest oparte o listę (po szczegóły znowu odsyłam do poprzedniego wpisu) dlatego ta przestrzeń będzie zawsze w tym samym miejscu (kolejności), natomiast możemy przesuwać ich zawartość.

crtl+b { 
crtl+b }

Szyby możemy powiększać, pomniejszać wedle uznania

crtl+b alt+ [‹^ˇ›]

jednakże jeżeli nie jesteście w sesji xorg lub wayland - alt oraz ‹› będą przełączać między terminalami tty analogicznie jak alt + f1-f6, w tym przypadku możesz posłużyć się mniej poręcznym skrótem

crtl+b esc+[‹^ˇ›]

Jedną z ciekawszych opcji są układy szyb, domyślnie mamy 5 stylów stack mode, hstack mode, grind, układ horyzontalny i wertykalny. Grzebiąc w plikach konfiguracyjnych możemy te style zmieniać na swoje.

crtl+b spacja

z mniej spektakularnych opcji: zamknięcie szyby

crtl+b x

powiększenie szyby do rozmiarów okna, ponawiamy jeżeli chcemy wrócić do poprzedzanego rozmiaru.

crtl+b z

Wierzchołek góry lodowej

Tmux ma niesłychanie spore możliwości, zawsze jak tylko pogrzebię natykam się na coś nowego, nowy sposób wykorzystania dotychczasowych rozwiązań. Żeby wpis był zjadliwy ograniczę się do dwóch bardziej zaawansowanych sposobów używania tmuxa, które są wartościowe i mogą pomóc w codziennej pracy.

Synchronizacja szyb

Z pozoru wydaje się nieprzydatne- pisanie naraz we wszystkich szybach w danym oknie.

crtl + b :setw synchronize-panes on

Coś co może się przydać np. przy konfiguracji większej ilości serwerów w jednakowy sposób lub uruchamianiu czegoś w relatywnie tym samym czasie w kilku miejscach. Nie przydaje się za często, ale jak będzie potrzeba oszczędzi masę czasu.

By wyłączyć adekwatnie.

crtl + b :setw synchronize-panes off

Oglądaj się za siebie

Zawsze mnie wkurzał ten moment, gdy na początku ekranu program zwracał istotną informację, a potem zasypywał nieistotnymi z naszego punktu widzenie informacjami. Pół biedy, gdy masz terminal z bufforem najlepiej dużym wtedy można sobie spokojnie przeskrolować w dane wyjściowe z terminala i prześledzić co za informacja nam umknęła. Smutna informacja jest taka, że nie każdy terminal ma taką funkcjonalność lub z jakiegoś powodu jego bufor jest za mały- tmux może tu przyjść z pomocą. Przejść do modułu kopiowania możemy przez

crtl + b [

teraz możemy spokojnie przewijać tekst góra i dół, domyślnie też jest opcja poruszania się w stylu emacs, vi style można włączyć

crtl +b :set-window-option -g mode-keys vi

jeżeli chcemy skopiować tekst zaznaczamy go

crtl + b space

po zaznaczaniu kopiujmy

crtl + b w

wklejamy do dowolnego okna w tej sesji tmuxa

crtl+ b ]

wychodzimy z trybu kopiowania

q

Domyślne buffor ma 2000 linii jest to dość mała liczba możemy ją zwiększyć za pomocą

crtl +b :set -g history-limit 100000

to dotyczy tylko jednego okna możemy tą komendę zapisać w pliku konfiguracyjnym tmuxa, wtedy wszystkie ustawienia będą dotyczyć każdej sesji, tworzymy/edytujemy plik ~/.tmux.conf możemy zapisać tam np. moje ustawienia tmuxa, plik będzie wyglądał tak

#indeksowanie od 1 zamiast od 0
set -g base-index 1
#zwiększenie buforu
set -g history-limit 100000
#vim!
set-window-option -g mode-keys vi
#zapisywanie historii do pliku
bind-key p command-prompt -p 'save history to filename:' -I '~/tmux.history' 'capture-pane -S -32768 ; save-buffer %1 ; delete-buffer'

żeby załadować plik konfiguracyjny wpisujemy

crtl + b :source-file ~/.tmux.conf

W moim configu jest linia, którą warto omówić

bind-key p command-prompt -p 'save history to filename:' -I '~/tmux.history' 'capture-pane -S -32768 ; save-buffer %1 ; delete-buffer'

jest to szczególnie przyjemna funkcjonalność :) jednym przyciskiem zrzucamy cały (ostatnie 32768 linii można więcej) pane (szybę) do pliku, to jakby nagrać sesję i zostawić sobie ją na później lub wysłać ją komuś mądrzejszemu, kto powie Ci co zrobiłeś źle.

crtl + b p

 
dlaczego nie Screen ?

GNU Screen jest ekstremalnie stabilnym kawałkiem kodu, dlaczego więc powinieneś go zamienić na Tmuxa? Nie powinieneś! Jeżeli używasz Screena, nie zmieniaj swoich nawyków wartość dodana jaką może przynieść Tmux pewnie nie przewyższy niedogodności związanych ze zmianą nawyków. Jeżeli nie używałeś do tej pory Screena warto wybrać właśnie Tmuxa widzę kilka powodów:

  1. Zarządzanie układem okien jest dobrze wykonane, całość przypomina mi takie tiling window menager jak dwm czy awesome. Przy używaniu Screena jest problem z zapisem układu okien po odłączaniu się z sesji (detached), nie udało mi się nigdy powrócić do Screena i odzyskać okien podzielonych vertykalnie lub horyzontalnie. Nie jest to duży problem dla tych, którzy i tak nie lubią korzystać z tych opcji, dla mnie to spora niedogodność.
  2. Tmux posiada wsparcie dla skrótów klawiszowych w stylu Vima jak i Emacsa. Screen wspiera tylko Emacsa, zwolennicy Vima są pewnie niepocieszeni. Oczywiście można to obejść, edytować pliki konfiguracyjne i stworzyć skróty klawisze jakie tylko sobie wymarzymy i tu znów wydaje mi się, że łatwiej będzie to zrobić w Tmuxie.
  3. Mniejsze zużycie zasobów przez Tmuxa- długi czas myślałem, że to tylko czcze gadanie w końcu kogo obchodzi kilka KB. Zrobiłem eksperyment tworząc 50 pustych sesji w Tuxie i Screenie, i wygląda na to że Tmux zajmuje ~30% mniej RAMu przy tylu sesjach w tle, dalej są to megabajty ale… :)
  4. Łatwość w oskryptowaniu klawiszy, właściwie każdą czynność którą wykonywaliśmy przy pomocy Tmuxa możemy oskryptować, w mojej subiektywnej opinii jest to łatwiejsze do zrobienia w Tmuxie niż Sreeenie.

Są jakieś inne opcje?

Po za duopolem alternatyw chyba w tym momencie brak, są jednak pewne rozwiązania, które ułatwiają życie użytkowaniu Tmuxa – oto kilka ciekawszych.

Jeżeli Screen i Tmux są za trudne albo mało intuicyjne możesz spróbować Byobu. Jest to nakładka na Tmuxa i Screena, dodatkowa warstwa abstrakcji. Osobiście nie znalazłem w niej niczego przełomowego, ale ułatwia pracę osobom początkującym głównie przez uproszczone skróty klawiszowe oraz ma skonfigurowany pasek out-of-box w bardziej przystępny sposób.

Wemux za to jest nakładką na Tmuxa, która pomaga w skonfigurowaniu go w sposób zorientowany na Pair Programing. Posiada takie opcje jak udostępnienie sesji „tylko do odczytu” by pokazać nad czym się teraz pracuje. Są też powiadomienia o podłączaniu się użytkowników wszystko out-of-box.

Do automatyzacji zadań może posłużyć Tmuxinator. Można za jego pomocą zdefasonować widok oraz uruchomić skrypty (polecenia) w każdej z szyb czy okien. Przykładem może być uruchomienie polecania ping w 20 oknach (szybach jeżeli ma się wielki monitor lub dobry wzrok :) ) jeżeli wykonuje takie zadania często może być dobrym pomysłem je oskryptować, można to też zrobić bezpośrednio w Tmuxie, ale Tmuxinator uprości to zadanie.

Parę słów na koniec

Wszystko co tu opisałem to tylko początek mojej przygody z Tmuxem, za każdym razem gdy tylko mam ochotę zagłębić się trochę bardziej w jego odmęty przekonuje się, że jest coś jeszcze do odkrycia. Jest to o tyle przyjemne, że mam świadomość że zawsze jest kolejna podróż do odbycia, kolejny pagórek do zbadania na którym jeszcze nie byłem. Mam nadzieję, że po przeczytaniu tego osoby, które nie słyszały o tmuxie wcześniej otworzą swój terminal i zainstalują go przez swój menadżer pakietów, zwłaszcza jeżeli macie pod opieką jakiś serwer tam się szczególnie przyda, poza tym Tmux jest fajny!  

linux oprogramowanie porady

Komentarze