Článků o terminálových multiplexerech jsme tu měli už několik – tedy přesně dva:
Screen: ještě mocnější terminál
Byobu: ještě o kousek lepší terminál
Dnes si povíme o třetím a rozšíříme tak velmi volnou „sérii“, která byla zahájena už před čtyřmi lety. Třetím do počtu dnes bude Tmux, který je zajímavou alternativou ke Screenu i z něj vycházejícímu Byobu.
Pokud vůbec netušíte, co to je terminálový multiplexer, pak vězte, že se jedná o software, který vám umožňuje v jednom terminálu otevřít více terminálů virtuálních. To se hodí zejména při dálkovém ovládání vzdáleného počítače přes SSH. Po spuštění multiplexeru si jednoduše otevřete více obrazovek, ve kterých můžete provádět nezávislé akce.
Navíc má tento přístup na serveru ještě jednu vynikající vlastnost – můžete se kdykoliv odpojit a nechat všechny terminály na druhé straně v provozu. V nich může probíhat například kompilace nějaké větší aplikace nebo jiná časově náročná akce. Časem se zase připojíte a dostanete se k terminálům v takovém stavu, v jakém jste je opustili. O této vlastnosti bude řeč ještě níže v článku.
Tmux je k dispozici pod licencí BSD a je možné jej přeložit pro Linux, FreeBSD, NetBSD, Solaris a AIX. OpenBSD jej má dokonce od roku 2009 ve svém hlavním (base) stromu. Samozřejmě jej s velkou pravděpodobností najdete také ve své oblíbené linuxové distribuci.
Čím Tmux zaujme
Tmux se od začátku snaží být moderní alternativou ke Screenu, který je tu s námi už od roku 1987 (!). Changelog jeho mladšího kolegy proti tomu začíná v polovině roku 2007, je tedy o dvacet let mladší. Přináší tak především modernější rozhraní, architekturu a více možností, které vám možná ve Screenu chybí.
Tmux je na rozdíl od Screenu (i když ten už to umí částečně taky) připraven přímo na práci s okny. Kromě přepínání celých obrazovek tak umožňuje pohodlně rozčlenit plochu terminálu na různě velká okna, která dokáže automaticky naskládat vedle sebe a potom mezi nimi pohodlně přepínat. Práce s ním vlastně připomíná tiling správce oken, které v X Window skládají okna jako dlaždice.
Tmux používá architekturu klient-server, kdy se serverový proces stará o běh jednotlivých spuštěných virtuálních terminálů. Ty jsou na sobě naprosto nezávislé a můžete si je pak připojovat do různých klientských částí. Dokonce je možné si jeden virtuální terminál otevřít současně ve více terminálech reálných. Prakticky si tuhle užitečnou vlastnost předvedeme později.
Tmux má vlastní rozhraní, které vám umožňuje ovládat jej ze skriptů. Můžete si tak naskriptovat nejčastější akce jako například „otevři mi další terminál a v něm mě přes SSH připoj do práce“. Skrze toto rozhraní je možné provádět stejnou sadu akcí, jaké můžete provádět ručně. Opět si ukážeme později.
Pokud se vám nelíbí „slepé“ ovládání Screenu, potěší vás Tmux podporou různých vysouvacích menu, která vám ulehčí orientaci v celém programu. Z dalších vlastností můžeme zmínit třeba automatické zamykání terminálu, podporu UTF-8 a 256barvových terminálů.
Praktické využití
Pro první krůčky s Tmuxem si musíme ukázat jeho základní ovládání. Pokud jste zvyklí na Screen, budete v Tmuxu jako doma. Jen jako klávesový prefix používá Ctrl-b místo Ctrl-a Screenu. Je možné to poměrně jednoduše v konfiguračním souboru přemapovat. Do souboru ~/.tmux.conf
připište následující řádky:
unbind C-b set -g prefix C-a bind C-a send-prefix
Pokud neznáte ovládání Screenu, pak vězte, že vždycky nejprve stisknete prefixovou kombinaci kláves (v tomto případě tedy standardně Ctrl-b) a poté jednu klávesu, která označuje požadovanou akci. Dále budou tyto akce popsány i s použitými klávesami.
Každopádně Tmux spustíte tak, že jednoduše ve svém reálném terminálu napíšete:
$ tmux
a objeví se vám základní obrazovka.
Teď už můžete začít základními akcemi jako je přidání terminálů, přesun mezi nimi, vyhledávání či přesun.
- Ctrl-b c nový terminál
- Ctrl-b n následující terminál
- Ctrl-b p předchozí terminál
- Ctrl-b , přejmenování terminálu
- Ctrl-b w zobrazí seznam terminálů
- Ctrl-b f vyhledávání mezi terminály
- Ctrl-b : přechod do příkazového režimu
- Ctrl-b d odpojení od Tmuxu
Tolik k základnímu ovládání. Stejně jako u Screenu je možné se poslední jmenovanou zkratkou odpojit od sezení. Tmux klient se nám zavře, ale server stále běží a s ním i všechny terminály, okýnka i procesy. Návrat provedeme pomocí
$ tmux attach
Pozor ovšem na to, že může existovat více různých sezení. V takovém případě budete připojeni k prvnímu z nich, což ovšem nemusí být vámi kýžený kousek. Můžete použít příkazu ls
a vybrat si sezení správné. Celý postup bude v praxi vypadat takto:
$ tmux ls 0: 1 windows (created Tue May 17 18:48:13 2011) [80x23] 5: 4 windows (created Tue May 17 18:55:09 2011) [80x23] (attached) 6: 1 windows (created Tue May 17 20:18:00 2011) [80x23] $ tmux attach -t 5
Práce s okýnky
Největší síla Tmuxu se ovšem ukrývá v tom, co jsme si zatím neukázali – v práci s okýnky. Jednotlivé terminály, které jsme si dříve vytvořili, si teď můžeme rozdělit na několik různých částí, které uvidíme zároveň a můžeme s nimi manipulovat.
- Ctrl-b % rozdělí obrazovku horizontálně
- Ctrl-b " rozdělí obrazovku vertikálně (po nastavení)
- Ctrl-b o přepni mezi okny
- Ctrl-b { posuň okno doleva
- Ctrl-b } posuň okno doprava
- Ctrl-b q ukaž čísla oken
- (zatímco jsou čísla zobrazena, stisk číslice vás přepne do vybraného okna)
Příkazový a skriptovací jazyk
Už jsem zmínil, že Tmux má mocný příkazový režim, který je možné využít i ve skriptech. K pokročilejšímu ovládání jej budete muset využít. Můžete si příkazy zapamatovat a psát je v interaktivním režimu (Ctrl-b :), nebo si je můžete namapovat na některou z kláves tak, jako to bylo ukázáno o několik odstavců výše.
Ukážeme si některé důležité příkazy, ostatní samozřejmě naleznete v dokumentaci k Tmuxu. Všechny příkazy i klávesy naleznete v manuálové stránce, která je opravdu dlouhá.
Poznámka: Příkazový řádek funguje velmi podobně jako řádka v terminálu. Pomocí tabulátoru příkazy doplňuje a má i historii, ve které se pohybujete pomocí kurzorových šipek.
- break-pane oddělí okno do samostatného terminálu
- resize-pane změní velikost okna nahoru
- resize-pane -U změní velikost okna dolů
- resize-pane -L změní velikost okna doleva
- resize-pane -R změní velikost okna doprava
- split-window -h rozdělí okno horizontálně
- split-window -v rozdělí okno vertikálně
- select-layout tiled rozmístí okna rovnoměrně po celé obrazovce (existují i další layouty)
Většina dalších příkazů se hodí ve skriptech, kterými můžete Tmux plně ovládat. Nastíníme si jen maličkou část možností v praktickém skriptu. Řekněme, že chcete připravit skript, který po spuštění připraví nějakou základní podobu vašeho terminálového sezení. Mohl by vypadat asi takto:
#!/bin/bash tmux new-session -d -s servery tmux new-window -t servery:1 -n 'Server1' 'ssh root@1.2.3.4' tmux new-window -t servery:2 -n 'Server2' 'ssh root@5.6.7.8' tmux new-window -t servery:3 -n 'Server3' 'ssh root@9.1.2.3' tmux select-window -t servery:1 tmux attach-session -t servery
Jen v krátkosti vysvětlení: nejprve je vytvořená nová session s názvem servery. V ní jsou vytvořeny tři virtuální terminály, ve kterých se rovnou spustí žádané příkazy. Pak se jedno z oken vybere a na proběhne spuštění klienta, který se k zadané session připojí. Takto bychom mohli ještě terminály rozdělit na různá okna, ta pak třeba naaranžovat a opět v nich spustit různé příkazy. Možnosti jsou nevyčerpatelné.
Tmux hned po přihlášení
Z praktické zkušenosti s užíváním podobných aplikací mám jednu významnou zkušenost: začnete je opravdu používat až ve chvíli, kdy se vám budou automaticky spouštět. Jinak si na to prostě nevzpomenete a raději si otevřete patnáct okýnek a třikrát se přihlásíte přes SSH, než abyste napsali do terminálu tmux
.
Do souboru .tmux.conf
v domovském adresáři si připište následující řádek
new-session
Pak už stačí do .bash_profile
připsat na konec řádek, který Tmux po přihlášení spustí.
tmux attach
Ten zajistí připojení k opuštěnému sezení nebo, pokud žádné sezení neexistuje, vytvoří nové. Pokud si tuto úpravu uděláte na vzdáleném serveru, nemusíte se o Tmux vůbec starat a vždycky ho budete mít po ruce.
Závěrem
Postupně jsem používal všechny tři už zmíněné multiplexery. Začal jsem na klasickém Screenu, později jsem přešel na chvíli na Byobu, ale nakonec jsem zakotvil na Tmuxu. Používám jej jak v Debianu, tak i ve FreeBSD a práce s ním mi přijde jednoznačně nejpřehlednější a nejpřímočařejší. Zkuste si ho taky.