Screen: ještě mocnější terminál

27. 3. 2007
Doba čtení: 7 minut

Sdílet

Přestože máme dnes k dispozici opravdu kvalitní grafické prostředí s řadou silných aplikací, konzole má stále ještě smysl a většina uživatelů unixů by si bez ní neuměla svou práci se systémem představit. Program, který umí řádky znásobit, existuje, a přesto jej překvapivě řada uživatelů nezná.

Řádka odedávna patří k „pravému unixu” a zřejmě nemá cenu na tomto serveru vysvětlovat její výhody. Její síla spočívá nejen v samotném způsobu ovládání počítače a v mnoha dostupných programech, ale především také v pohodlném vzdáleném přístupu, při kterém máte velmi dobrou kontrolu například nad svým serverem.

Znám řadu lidí, kteří takto denně administrují celkem slušnou řádku počítačů. Velmi mě ale překvapilo, když jsem zjistil, že poměrně velká část z nich nezná příkaz screen. Abych trochu pomohl osvětě, rozhodl jsem se sepsat článek pro všechny, kteří se s ním ještě nesetkali.

Mimochodem příkaz screen patří mezi klasické veterány a jeho vývoj je už dlouhou dobu v podstatě mrtvý. Michael Schroeder ovšem asi před měsícem oznámil, že bude ve vývoji pokračovat a chystá novinky jako podporu vertikálního dělení, layoutů pro uložení rozdělení obrazovky nebo podporu vytváření podskupin oken. Budoucnost screenu je tedy růžová.

Screen se představuje

Screen se obvykle nachází v samostatném balíčku, který má řádově stovky kilobajtů (v Debianu pro i386 konkrétně 568 Kb) a určitě jej najdete v repositářích své oblíbené distribuce.

Popis z balíčku říká, že se jedná o

Terminálový multiplexer s emulací terminálu VT100/ANSI, který dokáže provozovat nezávislé „obrazovky” na jednom fyzickém znakovém terminálu. Každý virtuální terminál pak emuluje DEC VT100 s několika ANSI X3.64 a ISO 2022 funkcemi.

Jednoduše řečeno tedy screen dovoluje na jednom terminálu vytvořit dalších n virtuálních obrazovek, mezi kterými pak můžeme přepínat a provozovat tak najednou více programů.

Určitě to znáte – připojíte se k serveru, začnete na něm s jednou činností, která bude trvat nějakou dobu a najednou si vzpomenete, že jste chtěli udělat ještě něco dalšího. Můžete sice aktuální proces poslat do pozadí, ale to neuvidíte jeho výstupy a nebudete s ním mít nadále kontakt. Přesně takové situace řeší screen.

První start

Screen spustíme jednoduše tak, že v terminálu napíšeme stejnojmenný příkaz

$ screen

Objeví se nám informační obrazovka, kterou odklepneme mezerníkem a dostaneme se do terminálu. V tuto chvíli to vypadá, že se nic nestalo, ale nenechejte se zmást, už jste ve screenu.

Jen pro zajímavost se můžete podívat, co ukáže příkaz  pstree.

$ pstree

...
|-sh---xterm---bash---screen---screen---bash
...

Já jsem screen zavolal v X Window v klasickém xterminálu. Jak vidíte, první bash (ten v xterm) spustil screen, který pod sebou opět pustil další bash. Právě v tom se teď nacházíme.

Je to úplně normální terminál, ve kterém můžeme pracovat, jak jsme zvyklí. Screen nad ním ovšem drží ochrannou ruku a dokáže vytvářet zmíněné virtuální obrazovky, přepínat mezi nimi a má mnoho dalších užitečných funkcí.

Ovládání screenu

Řízení samotného screenu není obtížné a zvyknete si na něj poměrně rychle. Hlavní klávesovou zkratkou, kterou screen používá je Ctrl+a. Tato zkratka je pak následována další klávesou (tentokrát už bez Ctrl), která symbolizuje jednotlivé akce. Tyto klávesy jsou case sensitive, takže A není totéž co a!

Vytváření a přepínání obrazovek

Můžeme si tedy zkusit vytvořit další virtuální obrazovku. K tomu slouží příkaz create. Stiskneme tedy Ctrl+a c a objeví se nám nový bash (nebo jiný oblíbený shell).

Opět ukázka pstree:

$ pstree
...
  |-sh---xterm---bash---screen---screen-+-bash
  |                                     `-bash
...

Vidíte, že screen založil nový bash a nechává v paměti běžet oba. Pro přepnutí mezi nimi můžeme použít několik různých příkazů. Jednak je to previous pro předchozí terminál a next pro následující. Jednotlivé virtuální obrazovky jsou totiž řazeny podle pořadí, v jakém jste je spustili. Můžete mezi nimi tedy tímto způsobem cyklovat.

Pokud vám to nestačí, můžete použít orientaci podle čísel. Každý virtuál má totiž vlastní pořadové číslo, počínaje nulou. Jednoduše tak stisknete Ctrl+a 1 a dostanete se na první (tedy po nule druhou) obrazovku.

Poslední šikovnou možnost skýtá znak (uvozovka). Nevýhodou je, že je potřeba ji psát se stisknutým shiftem, celý postup je tedy Ctrl+a Shift+“. Zobrazí se nám seznam všech otevřených obrazovek, ve kterém můžeme listovat kurzorovými klávesami a klávesou Enter pak na zvolenou obrazovku přejdeme.

Obrazovky jsou v tomto terminálu pojmenovány standardně podle spuštěného příkazu (tedy bash). Pokud si chceme terminály přejmenovat, můžeme použít příkaz renAme (tedy velké A) a screen nám nabídne možnost přejmenování.

Rozdělení obrazovky (split)

Velmi užitečná je také možnost rozdělit obrazovku na dvě stejné horizontálně rozdělené poloviny. K tomu slouží příkaz Split. Po jeho aktivaci dojde k rozdělení obrazovky na dvě stejné poloviny. Takto můžeme samozřejmě dělit dále na další „pruhy”.

V nich můžeme jako obvykle libovolně přepínat jednotlivé obrazovky a měnit tak jejich obsah. Mezi jednotlivými splity (částmi fyzické obrazovky) se pak přepínáme s pomocí Ctrl+a Tab.

Pokud se splitů chceme zbavit, použijeme příkaz Quit. Tím zmizí veškeré rozdělení obrazovky a právě aktivní okno se opět roztáhne přes celou obrazovku.

Rozdělení se hodí ve chvíli, kdy potřebujeme zároveň sledovat výstupy nějaké aplikace a při tom pracovat na něčem jiném. Šikovné je to také v případě, že chceme porovnávat dva soubory a podobně.

Odpojení screenu

Další velmi důležitou funkcí screenu je možnost jeho odpojení. To je užitečné, pokud chceme na vzdáleném počítači spustit náročnou aplikaci, která poběží několik dní, a pak uzavřít SSH spojení. Pokud bychom to udělali bez screenu, prostým uzavřením spojení bychom ukončili i běh aplikace.

Pokud se chceme odpojit, použijeme příkaz detach, což anglicky skutečně znamená odpojit. V tu chvíli je zdánlivě screen ukončen a vracíme se do původního bashe. Na obrazovce zůstane jen nápis  [detached]:

$ screen
[detached]
$

Všechny aplikace, které jsme ale ve screenu „nechali”, běží dál, jako by se nechumelilo. Nyní se můžeme odpojit a programy v paměti budou pracovat dál. Můžeme si také spustit novou instanci programu screen a tu původní tím neovlivníme.

Pokud se chceme k práci vrátit, můžeme tak učinit spuštěním screenu s parametrem -r. Může se nám ale stát, že jsme odpojili více screenů za sebou. Pokud chceme připojit konkrétní z nich, použijeme parametr  -ls.

$ screen -ls
There are screens on:
        6652.pts-1.Masina       (Detached)
        6689.pts-1.Masina       (Detached)
2 Sockets in /var/run/screen/S-petr.

Pak použijeme k obnovení číslo, které je u screenu uvedeno

$ screen -r 6652

Více uživatelů na jednom screenu

Tato funkce se může hodit ve více případech. Mohli jste třeba někde nechat screen otevřený a teď se k němu potřebujete přípojit. Velmi efektivní je ovšem tento přístup ve chvíli, kdy chcete někomu vzdáleně předvádět nějaké postupy na unixovém terminálu.

V prvním případě je situace jednodušší. Přihlásíte se jako uživatel, pod kterým screen běží a zavoláte

$ screen -x

V tu chvíli se otevře screen a na obou stranách se děje totéž. Pokud se chceme zase odpojit, stačí použít známou zkratku Ctrl+a d.

Jestliže si přejeme k našemu screenu pustit i cizího uživatele, je situace o něco složitější. Jednak budete muset screenu přidělit setuid bit, který způsobí, že se bude spouštět s právy uživatele root. To je sice poměrně nebezpečné, ale v tomto případě nutné.

Pak na terminálu, který budeme sdílet, stiskneme Ctrl+a : a napíšeme příkaz multiuser on. Tím jsme zapnuli multiuživatelský režim. V tuto chvíli se k nám ale druhý uživatel ještě nepřipojí. Musíme mu k tomu udělit právo. Opět tedy stiskneme postupně Ctrl+a : a napíšeme příkaz addacl pavel. V tu chvíli dostane uživatel pavel plné právo k našemu screenu.

To ale nemusí být vždy ideální a asi bychom nechtěli, aby měl Pavel plnou kontrolu. My mu ovšem můžeme sebrat právo zápisu a nechat ho jen pasivně přihlížet tomu, co mu chceme předvádět. Opět tedy Ctrl+a : a zadáme chacl pavel -w "#". Tím zrušíme Pavlovi právo zápisu (write) na všechny naše screeny. Pochopitelně místo # můžeme vložit konkrétní číslo a regulovat tak pravidla na jednotlivých screenech.

Pavel pak už jenom ve svém terminálu zadá

$ screen -r petr/6652.pts-1.Masina

a připojí se.

Uzamčení obrazovky

Pokud od svého terminálu odcházíte a byli byste neradi, kdyby se vám v něm šťoural někdo cizí, můžete použít zkratku Ctrl+a x, která zamkne aktuální sezení a pro další používání bude vyžadovat heslo aktuálního uživatele.

Závěrem

Doufám, že se vám malá exkurze po silném unixovém příkazu líbila a hodila. Jsem přesvědčen o tom, že kdo screen nepoužívá, přichází o mnoho. Ten, kdo pozná jeho výhody, už nechce jinak.

bitcoin_skoleni

Souhrn nejdůležitějších příkazů a parametrů

Na závěr si ještě zopakujeme ty nejdůležitější příkazy, o kterých jsme si řekli. Připomínám, že je potřeba před nimi stisknout zkratku Ctrl+a.

  • create – vytvoří nový terminál
  • previous – přepne na předchozí terminál
  • next – přepne na následující terminál
  • 0 až 9 – přepne na terminál dle pořadí od nuly
  • " – zobrazí seznam otevřených terminálů
  • renAme – přejmenování aktuální obrazovky
  • Split – rozdělí obrazovku
  • Tab – přepínání mezi splity
  • Quit – uzavře všechny splity
  • detach – odpojení od screenu
  • x – zamkne obrazovku

Následují důležité parametry

  • -ls  – vypíše seznam aktivních terminálů
  • -r  – opět připojí dříve odpojený screen
  • -r n  – připojí odpojený screen s číslem n
  • -x  – připojení vlastního terminálu, který běží

Znali jste screen?

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.