Linuxový nástroj tmux funguje jako terminálový multiplexer, podobně jako program screen. Je velmi oblíbený, a proto se podíváme na srovnání obou. Opravdu je tmux lepší, nebo jde jen o zvyk?
Srovnání tmux a screen
Jak tmux, tak i GNU screen jsou terminálové multiplexery. To znamená, že vám umožní pracovat s více okny v rámci jediného terminálového okna a libovolně mezi nimi přepínat. Okno můžete rozdělit na panely, přičemž každý z nich funguje jako samostatný příkazový řádek.
Relaci lze odpojit a ta pak běží skrytě na pozadí – a to i v případě, že zavřete okno terminálu, ve kterém byla spuštěna. Později, když budete chtít, stačí otevřít nové okno terminálu a znovu se k běžící relaci připojit. Funguje to dokonce i při připojení přes SSH.
Relaci můžete odpojit například v práci, pak se vrátit domů a přihlásit se k vzdálenému počítači. Po připojení můžete pokračovat v práci s odpojenou relací.
Co umí program screen?
Screen je také terminálový multiplexer a má spoustu funkcí. Pokud chcete vědět, co všechno umí, podívejte se na náš podrobný článek.
My se ale tentokrát zaměříme na tmux. Postupně si řekneme, jak screen zvládá stejné funkce.
Na screenu nám vadí jedna věc. Probereme ji, až se k ní dostaneme, a podíváme se, zda si tmux vede lépe.
Instalace tmux
Zatímco screen je většinou standardně nainstalován na populárních distribucích Linuxu, tmux ne. Pro instalaci tmux na Ubuntu zadejte:
sudo apt-get install tmux
Pro Manjaro použijte pacman:
sudo pacman -Sy tmux
Na Fedoře 31 už je tmux nainstalovaný.
Spuštění relace tmux
Pro spuštění tmux stačí zadat příkaz a stisknout Enter:
tmux
Pokud jste v relaci tmux, zobrazí se ve spodní části terminálu stavový řádek.
V pravé části stavového řádku se zobrazuje jméno hostitele, aktuální čas a datum. V levé části najdete informace o relaci:
[0]: Název relace. Standardně se číslují od nuly. Později si ukážeme, jak můžete relacím přiřadit popisnější jména.
0:bash*: 0 označuje první okno v relaci. Běží v něm proces bash. Pokud spustíte jiný program, zobrazí se jeho název. Hvězdička * ukazuje, že toto okno je aktuálně aktivní. Pokaždé, když vytvoříte nové okno, objeví se jeho číslo a název spuštěného programu na stavovém řádku.
Příkaz screen stavový řádek nezobrazuje. Musíte pracovat naslepo a spoléhat na svou intuici, abyste věděli, co se děje. Chce to trochu cviku.
Výhodou je, že neukrajuje místo v terminálovém okně. Nicméně obvykle byste okno terminálu měli rozšířit, aby se použití terminálového multiplexeru vyplatilo. Ztráta jednoho řádku pro stavový řádek tedy není velký problém. Obrázky oken terminálu necháváme ve výchozí velikosti, aby bylo vidět, jaké informace se zobrazují.
Příkazy se do tmux zadávají pomocí klávesových zkratek, které se skládají ze dvou částí. Nejprve stiskněte Ctrl+B, čímž aktivujete tmux. Pak rychle stiskněte další klávesu, abyste zadali příkaz. Používají se písmena, číslice, interpunkční znaménka nebo šipky.
U screenu je to stejné, jen se k aktivaci používá Ctrl+A.
Pro zavření okna stiskněte Ctrl+B a poté rychle X. Stavový řádek se zbarví do oranžova. Budete vyzváni k potvrzení zavření okna.
Stiskněte Y pro zavření okna nebo N, pokud jste si to rozmysleli. Není nutné poté stisknout Enter. Stačí Y nebo N pro potvrzení.
Pokud stisknete Y, okno se zavře. Protože jde o jediné okno v relaci, relace se ukončí a vrátíte se na příkazový řádek. V okně terminálu se zobrazí „[exited]“.
Zdá se, že je to jasné, ale jedná se o potvrzení, že jste relaci ukončili a nenechali ji odpojenou a běžící. Odpojené relace budeme probírat dále.
Spuštění pojmenované relace tmux
Pokud často spouštíte více relací tmux, rychle si oblíbíte možnost každé z nich dát smysluplné jméno. Relace lze pojmenovat i v screenu, ale jméno se nikde v oknech relací nezobrazuje.
tmux new -s geek-1
Pro spuštění tmux s názvem relace použijte příkaz new (nová relace) a volbu -s (název relace). Naše relace se bude jmenovat „geek-1“, takže zadáme:
Relace tmux s názvem
Přidání dalších oken. Pro vytvoření nového okna v aktuální relaci stiskněte Ctrl+B a poté C. Získáte prázdné okno terminálu. Takže, abychom v tomto novém okně měli něco spuštěného, začněme příkaz dmesg.
dmesg -w
s volbou -w (sledovat):
Nyní máme v relaci dvě okna: v prvním běží top a v druhém dmesg. V jednu chvíli však můžeme vidět jen jedno (více o tom za chvíli).
Podívejte se na levou stranu stavového řádku. Stále jsme v relaci tmux „geek-1“. V okně 0 běží top a v okně 1 běží dmesg. Hvězdička * u dmesg signalizuje, které okno je viditelné.
Pro přepínání mezi okny stiskněte Ctrl+B a poté jednu z následujících kláves:
N: Zobrazí další okno.
P: Zobrazí předchozí okno.
0 až 9: Zobrazí okno s číslem 0 až 9.
Okno můžete vybrat také ze seznamu. Pokud stisknete Ctrl+B a poté W, zobrazí se seznam oken.
Pro posun oranžového zvýrazněného pruhu použijte šipky nahoru a dolů, Home nebo End. Ve spodní části se zobrazuje náhled obsahu zvýrazněného okna.
Stisknutím klávesy Enter přejdete do zvýrazněného okna nebo klávesy Esc pro opuštění seznamu oken bez přepínání.
Odpojení a připojení relací
Pokud stisknete Ctrl+B a poté D, relaci odpojíte. Ta bude dál běžet na pozadí, ale neuvidíte ji a nebudete s ní moci pracovat.
Začali jsme relaci s procesem top, takže máme běžící proces, na kterém si to můžeme ukázat. Nyní stiskněte Ctrl+B a poté D. Relace zmizí a běží na pozadí.
Vrátíme se do původního okna terminálu. Od tmux dostaneme informaci, že relace je odpojená. Také nám připomene jméno, které jsme jí dali. To je užitečné, protože jméno použijeme pro opětovné připojení k relaci na pozadí.
tmux attach-session -t geek-1
Pro připojení odpojené relace použijeme příkaz connect-session s volbou -t (cílová relace). Zadáváme jméno relace, kterou chceme obnovit.
Zadáme tedy:
Naše relace se vrátí a opět je viditelná a interaktivní.
Všechny dlouho běžící procesy, které byly spuštěny před odpojením relace, budou po připojení relace stále běžet na pozadí (pokud se již nedokončily).
Screen to umí také, ale ne tak intuitivně.
tmux new -s geek-2
Práce s více relacemi
dmesg -w
Otevřeme další okno terminálu a spustíme novou relaci tmux s názvem „geek-2“:
V této relaci spustíme dmesg:
Nyní máme naši původní relaci tmux „geek-1“ a novou „geek-2“.
Stavový řádek ukazuje, že relace se nazývá „geek-2“ a má jedno okno, ve kterém běží dmesg.
Pokud stiskneme Ctrl+B a poté D, relaci odpojíme.
Zpět v relaci tmux „geek-1“ stiskněte Ctrl+B a poté S, čímž se zobrazí seznam relací tmux.
Aby bylo jasno, jedná se o seznam relací. Podobné zobrazení, které jsme viděli dříve, byl seznam oken v jedné relaci.
Žlutý zvýrazněný pruh můžete posouvat pomocí šipek nahoru a dolů, Home a End. Ve spodní části se zobrazuje náhled obsahu ve zvýrazněné relaci.
Pokud stisknete šipku vpravo, zobrazí se okna dané relace.
Stisknutím klávesy Enter se přesunete do zvýrazněné relace nebo okna, nebo stisknutím Esc opustíte seznam relací bez změny. Pokud vyberete novou relaci, vaše aktuální relace se odpojí a vybraná relace se připojí.
Než jsme to udělali, odpojili jsme sezení „geek-2“. Můžete to však udělat i s relacemi, které jsou stále připojeny ke svým původním oknům terminálu. Změny se pak projeví současně v obou relacích tmux.
Příkaz screen to zvládá s podobnou sadou příkazů.
Práce s panely oken
Pokud stisknete Ctrl+B a poté dvojité uvozovky (“), rozdělíte okno vodorovně na dva panely.
Týká se to pouze aktuálního okna. Ostatní okna v relaci se nezmění. Pro zobrazení seznamu oken v relaci jsme použili příkaz tmux ls v horním panelu. Jsou dvě a stavový řádek ukazuje, že jsme v okně 1. Pokud se přepneme do okna 0 stisknutím Ctrl+B a poté 0 (nula), uvidíme, že je přesně tak, jak jsme ho opustili.
Jedná se o dva nezávislé příkazové řádky, ne dva pohledy v jednom okně. Jsou to samostatné shelly. Můžeme to ukázat spuštěním jiného příkazu v každém panelu.
Zadáme:
uname -a
ls -hl
Pro přesun z jednoho panelu do druhého stiskněte Ctrl+B a poté šipku nahoru, dolů, doleva nebo doprava.
Pokud stisknete Ctrl+B a poté procento (%), rozdělí se aktuální panel svisle.
Stiskněte Ctrl+B a poté Q, tmux krátce zobrazí číslo každého panelu.
Tato čísla se používají v hlášeních a výzvách od tmux. Stisknutím Ctrl+B a potom X zavřete aktuální panel. Stavový řádek se zbarví do oranžova a budete vyzváni k potvrzení zavření panelu. Stiskněte Y pro odstranění panelu nebo N pro ponechání beze změny.
Pokud stisknete Y, panel se odstraní.
Příkaz screen má také panely, ale jejich použití není tak intuitivní. Jedna věc, která nám na screenu vadí, je to, že pokud odpojíte relaci s panely, zmizí, když se k této relaci znovu připojíte. To se rychle omrzí.
Přehled klávesových zkratek Ctrl+B
Níže uvádíme přehled různých příkazů, které můžete v tmux použít.
Příkazy relace
S: Seznam relací.
$: Přejmenování aktuální relace.
D: Odpojení aktuální relace.
Ctrl+B a poté ?: Zobrazení stránky nápovědy v tmux.
Příkazy oken
C: Vytvoření nového okna.
,: Přejmenování aktuálního okna.
W: Seznam oken.
N: Přechod na další okno.
P: Přechod na předchozí okno.
0 až 9: Přechod na okno se zadaným číslem.
Příkazy panelů
%: Vytvoření vodorovného rozdělení.
“: Vytvoření svislého rozdělení.
H nebo šipka doleva: Přesun na panel vlevo.
I nebo šipka vpravo: Přesun na panel vpravo.
J nebo šipka dolů: Přesun na panel níže.
K nebo šipka nahoru: Přesun na panel výše.
Q: Krátké zobrazení čísel panelů.
O: Procházení panely v pořadí. Každým stisknutím se dostanete na další panel.
}: Výměna pozice aktuálního panelu s následujícím.
{: Výměna pozice aktuálního panelu s předchozím.
X: Zavření aktuálního panelu.
Jak si stojí v porovnání
Funkčně jsou si screen i tmux podobné a nabízejí stejné hlavní funkce. Liší se však způsob, jakým k funkcím přistupujete. tmux nabízí přehlednější a pohodlnější způsoby, jak používat různé funkce. To ale není jediný rozdíl.
Možnost přejmenovat relace a okna v tmux je praktická a fakt, že si zachová panely, i když se znovu připojíte k relaci, je revoluční.
Naproti tomu screen při odpojení a opětovném připojení relace panely zcela ztratí. To je dost otravné na to, abyste se odpojování raději vyhnuli.
Tmux nabízí mnohem více, včetně neuvěřitelně flexibilních možností skriptování. Určitě byste ho měli vyzkoušet.