Како користити тмук на Линуку (и зашто је бољи од екрана)

Terminalni multiplekseri poput tmux-a i screen-a omogućavaju korisnicima da upravljaju sa više terminala unutar jednog prozora. Popularnost tmux-a je značajna, pa je korisno istražiti prednosti i nedostatke u odnosu na stariji screen. Da li je tmux zaista superioran ili je to samo stvar navike?

Poređenje tmux i screen

I tmux i screen su terminalni multiplekseri koji dozvoljavaju kreiranje više prozora unutar jedne sesije terminala. Korisnik može lako prelaziti između ovih prozora, a svaki prozor se može podeliti na manje panele, pružajući nezavisne komandne linije.

Osim toga, sesija se može odvojiti (detach) i nastaviti da radi u pozadini, čak i kada se terminalni prozor koji ju je pokrenuo zatvori. Kada je potrebno, korisnik može ponovo priključiti (attach) sesiju iz novog terminalnog prozora, čak i preko SSH veze. Ovo omogućava prekidanje rada na jednom računaru, nastavak na drugom, uz očuvanje svih pokrenutih procesa i stanja.

Na primer, korisnik može pokrenuti sesiju na jednom računaru, odvojiti je, otići kući, prijaviti se na udaljeni računar, ponovo priključiti sesiju i nastaviti sa radom.

Šta je komanda screen?

Komanda screen je, takođe, terminalni multiplekser, sa velikim brojem opcija. Za detaljan opis mogućnosti, pogledajte relevantne članke. U ovom tekstu fokusiramo se na tmux, uz napomene o sličnostima i razlikama u funkcionisanju sa screen-om.

Postoji jedna stvar koja je iritirala korisnike kod screen-a, a koju ćemo objasniti kada dođemo do toga i videti da li tmux nudi bolje rešenje.

Instalacija tmux-a

Dok je screen često predinstaliran na popularnim Linux distribucijama, tmux nije. Za instalaciju tmux-a na Ubuntu, unesite sledeću komandu:

sudo apt-get install tmux

Na Manjaru se koristi pacman:

sudo pacman -Sy tmux

Na Fedora 31, tmux je već instaliran.

Pokretanje tmux sesije

Za pokretanje tmux-a, jednostavno unesite tmux i pritisnite Enter:

tmux

Unutar tmux sesije, na dnu terminalnog prozora se pojavljuje statusna traka.

Desna strana statusne trake prikazuje ime hosta, vreme i datum. Leva strana prikazuje informacije o sesiji:

[0]: Ovo je naziv sesije. Podrazumevano, sesije su numerisane počevši od nule. U nastavku ćemo objasniti kako davati smislena imena sesijama.
0:bash*: 0 označava da je ovo prvi prozor u sesiji. Jedini proces koji se trenutno izvršava je bash. Ako pokrenete program, njegovo ime će se pojaviti ovde. Zvezdica (*) označava da je ovo prozor koji je trenutno aktivan. Svaki put kada se kreira novi prozor u tmux sesiji, njegov broj prozora i ime programa koji se izvršava se dodaju u statusnu traku.

Screen ne nudi statusnu traku, što znači da korisnik mora da prati otvorene prozore i procese koristeći pamćenje i iskustvo. S druge strane, screen ne zauzima dodatni prostor na terminalu. Međutim, kada se koristi terminalni multiplekser, obično se koristi veći prozor terminala, pa gubitak jedne linije za statusnu traku nije veliki problem. Slike terminalnih prozora ovde su u podrazumevanoj veličini radi prikaza informacija.

Komande se tmux-u šalju kombinacijom tastera. Prvo se pritisne Ctrl+B kako bi se aktivirao tmux. Zatim se brzo pritisne sledeći taster za izvršenje komande. Komande se mogu zadavati pomoću slova, brojeva, interpunkcijskih znakova i strelica.

Isti princip važi i za screen, osim što se Ctrl+A koristi za aktiviranje.

Za zatvaranje prozora, pritisnite Ctrl+B, a zatim brzo X. Statusna traka postaje žuta. Tada se traži potvrda zatvaranja prozora.

Pritisnite Y za zatvaranje ili N ako ste se predomislili. Nije potrebno pritiskati Enter nakon toga, Y ili N su dovoljni za registraciju izbora.

Ako pritisnete Y, prozor se zatvara. Pošto je ovo bio jedini prozor u sesiji, sesija se prekida i vraćate se na komandnu liniju sa koje je pokrenut tmux. Videćete poruku „[exited]“ u prozoru terminala.

Potvrda da je sesija zatvorena

Ovo možda izgleda očigledno, ali ovo je potvrda da je sesija zatvorena i da nije ostavljena odvojena i da radi u pozadini. U nastavku ćemo govoriti o odvojenim sesijama.

Pokretanje imenovane tmux sesije

Ako redovno pokrećete više tmux sesija, biće vam korisno da svakoj dodelite smisleno ime. Screen takođe omogućava imenovanje sesija, ali se ta imena ne prikazuju nigde u prozorima sesije.

tmux new -s geek-1

Za pokretanje tmux sesije sa imenom, koristi se komanda new (nova sesija) i opcija -s (ime sesije). Sesija se naziva „geek-1“.

tmux sesija sa imenom

Dodavanje više prozora: Da biste kreirali novi prozor u trenutnoj sesiji, pritisnite Ctrl+B, a zatim C. Dobit ćete prazan terminalski prozor u trenutnoj sesiji. Da bi bilo nešto što radi u ovom novom prozoru, pokrenimo dmesg komandu:

dmesg -w

sa opcijom -w (follow):

Sada imamo dva prozora u sesiji; jedan sa procesom top, a drugi sa dmesg. Međutim, možemo videti samo jedan po jedan (više o tome za trenutak).

Pogledajte levu stranu statusne trake. Još smo u „geek-1“ tmux sesiji. U nultom prozoru je pokrenut top, a u prozoru jedan je pokrenut dmesg. Zvezdica (*) pored dmesg označava koji prozor je trenutno vidljiv.
Za prelazak između prozora, pritisnite Ctrl+B, a zatim jedan od sledećih tastera:
N: Prikazuje sledeći prozor.

P: Prikazuje prethodni prozor.

0 do 9: Prikazuje prozor sa odgovarajućim brojem.

Takođe možete izabrati prozor sa liste. Ako pritisnete Ctrl+B, a zatim W, pojavljuje se lista prozora.

Za kretanje kroz listu prozora, koristite strelice gore i dole, Home ili End. Donji deo ekrana prikazuje pregled sadržaja u izabranom prozoru.

Pritisnite Enter za prelazak na izabrani prozor ili Esc za izlaz sa liste prozora bez promene aktivnog prozora.

Odvajanje i priključivanje sesija

Ako pritisnete Ctrl+B, a zatim D, odvojićete sesiju. Ona će nastaviti da radi u pozadini, ali nećete moći da je vidite ili koristite.

Počeli smo sa top procesom u sesiji, pa imamo proces koji radi za demonstraciju. Zatim pritisnemo Ctrl+B, a zatim D. Sesija nestaje i postaje pozadinska sesija.

Vraćamo se na originalni terminalski prozor. Postoji poruka od tmux-a koja obaveštava da je sesija odvojena. Takođe nas podseća na ime koje smo dali sesiji. Ovo je korisno jer se ovo ime koristi za ponovno priključivanje sesije.

tmux attach-session -t geek-1

Za priključivanje odvojene sesije, koristimo komandu attach-session sa opcijom -t (ciljna sesija). Takođe, koristimo ime sesije koju želimo da vratimo.

Unosimo sledeću komandu:

Sesija se vraća i ponovo postaje vidljiva i interaktivna.

Svi dugotrajni ili kontinualni procesi koji su pokrenuti pre odvajanja sesije će nastaviti da rade u pozadini (osim ako nisu završeni) kada se sesija ponovo priključi.

Screen može da uradi istu stvar, ali ne tako intuitivno.

tmux new -s geek-2

Upravljanje sa više sesija

dmesg -w

Otvorimo drugi prozor terminala i pokrenimo novu tmux sesiju pod nazivom „geek-2“:

U toj sesiji ćemo pokrenuti dmesg:

Sada imamo originalnu „geek-1“ tmux sesiju i novu pod nazivom „geek-2“.

Statusna traka pokazuje da se sesija zove „geek-2“ i da ima jedan prozor sa pokrenutim dmesg.

Ako pritisnemo Ctrl+B, a zatim D, odvajamo tu sesiju.

Nazad u „geek-1“ tmux sesiji, pritisnemo Ctrl+B, a zatim S da vidimo listu tmux sesija.

Da budemo jasni, ovo je lista sesija. Sličan prikaz koji smo videli ranije je bila lista prozora unutar jedne sesije.

Za pomeranje žute trake koristite strelice gore i dole, Home i End. Donji deo prikazuje pregled sadržaja u izabranoj sesiji.

Ako pritisnete strelicu udesno, prikazuju se prozori izabrane sesije.

Pritisnite Enter da biste prešli na izabranu sesiju ili prozor, ili Esc za izlaz iz liste sesija bez promene sesija. Ako izaberete novu sesiju, trenutna sesija se odvaja, a izabrana se priključuje.

Odvojili smo sesiju „geek-2“ pre ovoga. Međutim, isto možete uraditi i sa sesijama koje su još uvek povezane sa svojim originalnim terminalskim prozorima. Kada to uradite, sve promene na ekranu će se pojaviti istovremeno u obe tmux sesije.

Komanda screen takođe ima ovu mogućnost, uz sličan set komandi.

Rad sa prozorima

Ako pritisnete Ctrl+B, a zatim dvostruke navodnike („), prozor će se horizontalno podeliti na dva panela.

Ovo utiče samo na trenutni prozor; ostali prozori u sesiji se neće menjati. Koristili smo komandu tmux ls u gornjem oknu da nabrojimo prozore u ovoj sesiji. Ima ih dva, a statusna linija nam pokazuje da smo u prozoru broj jedan. Ako pređemo na nulti prozor pritiskom na Ctrl+B, a zatim 0 (nula), videćemo da je on isti kao što smo ga ostavili.

Ovo su dve nezavisne komandne linije, a ne dva pogleda u jednom prozoru; one su različite i odvojene shell sesije. Ovo možemo dokazati pokretanjem različite komande u svakom panelu.

Unosimo:

uname -a

ls -hl

Za prelazak iz jednog panela u drugi, pritisnite Ctrl+B, a zatim strelicu gore, dole, levo ili desno.

Ako pritisnete Ctrl+B, a zatim znak procenta (%), trenutni panel se deli vertikalno.

Pritisnite Ctrl+B, a zatim Q da bi tmux nakratko prikazao broj svakog panela.

Ovi brojevi se koriste u upitima i porukama od tmux-a. Pritisnite Ctrl+B, a zatim X da biste zatvorili trenutni panel. Statusna traka se menja u žutu i od vas se traži da potvrdite da želite da zatvorite panel. Pritisnite Y da biste uklonili panel ili N da biste ostavili stvari kakve jesu.

Ako pritisnete Y, panel se uklanja.

Komanda screen takođe ima panele, ali su manje intuitivni za korišćenje. Jedna od stvari koja iritira korisnike kod screen-a je da ako odvojite sesiju sa panelima, oni nestaju kada se sesija ponovo priključi. Ovo je za mnoge korisnike veliki problem.

Podsetnik za Ctrl+B komande

U nastavku je lista nekih od komandi koje možete koristiti u tmux-u:
Komande sesije
S: Lista sesija.
$: Promenite ime trenutne sesije.

D: Odvojite trenutnu sesiju.

Ctrl+B, a zatim ?: Prikažite stranicu pomoći u tmux-u.
Komande prozora
C: Napravite novi prozor.
,: Promenite ime trenutnog prozora.
W: Lista prozora.
N: Prelazak na sledeći prozor.

P: Prelazak na prethodni prozor.

0 do 9: Prelazak na prozor sa zadatim brojem.
Komande panela
%: Horizontalna podela panela.
„: Vertikalna podela panela.
H ili strelica nalevo: Prelazak na panel levo.
L ili strelica udesno: Prelazak na panel desno.
J ili strelica nadole: Prelazak na panel ispod.
K ili strelica nagore: Prelazak na panel iznad.
Q: Prikaz brojeva panela.
O: Prelazak na sledeći panel.
}: Zamena pozicije trenutnog panela sa sledećim.

{: Zamena pozicije trenutnog panela sa prethodnim.

X: Zatvaranje trenutnog panela.

Poređenje

Što se tiče funkcionalnosti, screen i tmux su slični i nude iste osnovne karakteristike. Međutim, načini pristupa tim funkcijama su značajno različiti. tmux nudi elegantnije i udobnije načine za korišćenje različitih funkcija, što je velika prednost.

Mogućnost promene imena sesija i prozora u tmux-u je korisna, a činjenica da tmux zadržava panele kada se sesija ponovo priključi je velika prednost.

Sa druge strane, screen potpuno gubi panele kada se sesija odvoji i ponovo priključi. Ovo može biti dovoljno iritantno da se izbegava odvajanje sesija.

tmux nudi mnogo više, uključujući i veoma fleksibilne mogućnosti skriptovanja. Vredi ga detaljnije istražiti.