Linux v příkazech - screen

Screen je nástroj, který umí přímo v terminálu realizovat věci, na něž jsme zvyklí z GUI.

14.2.2006 06:00 | Jiří Václavík | přečteno 72484×

Screen je manažerem pro práci v terminálu. Umí několik zajímavých věcí, z nichž si ty nejdůležitější představíme.

Podobně jako ve většině webových prohlížečů umožňuje screen práci se záložkami. Nejde však o záložky s webovými stránkami, ale s virtuálními terminály.

Rozdělení terminálu na virtuální terminály se využívá v případech, kdy máme k dispozici pouze jediné sezení a pro efektivnější práci si potřebujeme nasimulovat další. V Linuxu je však většinou k dispozici terminálů více, proto pro nás pravděpodobně budou zajímavější jiné funkce.

V úvodu můžeme předestlat, že mezi ně patří současná práce více lidí na tomtéž terminálu, horizontální rozdělení okna na několik částí, copy-paste metoda mezi terminály nebo zakonzervování stavu terminálu.

O instalaci se většinou není třeba starat. Pokud máte Linux, tak s největší pravděpodobností máte i screen.

Screen se spouští příkazem

$ screen [příkaz]

příkaz je nějaký příkaz shellu, který má být spuštěn v nultém okně screenu. Pokud žádný příkaz neuvedeme, nastartuje se do shellu. Od této chvíle se screen ovládá téměř výhradně klávesovými zkratkami.

Rozdělení terminálu do více oken

Spustíme tedy screen bez argumentů. Měl by se zobrazit text o screenu. Stiskem mezerníku se vyčistí obrazovka. Nyní máme nastartovaný nultý virtuální terminál, na kterém můžeme normálně pracovat. Během práce však téměř vždy potřebujeme přeskakovat k nějakým vedlejším činnostem. Typickým příkladem je programování nebo úprava konfiguračních souborů. Potřebujeme minimálně jedno okno textového editoru, další okno pro překlad, spouštění a nebo testování a občas je nutná manuálová stránka nebo anglicko-český slovník. I v případech, kdy je k dispozici více terminálů, bude často nejpohodlnějším řešením screen.

Ze všeho nejdříve však představme příkaz C-a ?, který slouží jako rychlá nápověda.

Nápověda po stisku C-a ?

V okně, které se zobrazilo po spuštění screenu budeme třeba upravovat konfigurační soubory. Stiskneme C-a c a obrazovka se opět vyčistí. Nyní jsme v prvním okně. V tomto terminálu si spustíme manuálovou stránku. Ještě jednou stiskneme C-a c a v druhém okně spustíme například midnight commander.

Máme vytvořena tři okna (nulté, první, druhé). Stiskem C-a " se objeví obrazovka s jejich přehledem.

Přehled oken po stisku C-a "

Kurzorovými klávesami vybereme virtuální terminál a stiskneme ENTER. Takto se pohybujeme mezi jednotlivými terminály.

Pro menší počet virtuáních terminálů existuje pohodlnější metoda, jak se mezi nimi pohybovat. K dispozici je klávesová zkratka C-a číslo_terminálu. Stiskem C-a 2 se dostaneme na druhý virtuální terminál, C-a 0 na nultý apod.

Pro přesunutí do následujícího okna existuje přímo zkratka C-a SPACE a pro předcházející okno C-a BACKSPACE. Poměrně často používaná kombinace pro přesun mezi okny je C-a C-a. Funguje jako přepínač mezi dvěma posledně zobrazenými okny.

Vraťme se však ještě k tabulce vyvolané stiskem C-a ". Implicitním jménem je, pokud nespouštíme aplikaci přímo (viz další odstavec), jméno příkazového interpretu. Pokud se každý terminál jmenuje stejně, jako je tomu v našem případě, příliš to práci neusnadňuje. Terminálům proto lze dát vlastní jména. Po stisknutí C-a A se objeví ve spodním řádku obrazovky výzva Set window's title to:. Sem napišme název pro aktuální okno. Odteď se bude v přehledu zobrazovat právě tento název.

Přehled oken s upravenými názvy

Nová okna lze otevírat dvěma způsoby. Buď se spustí shell nebo přímo program. C-a c spustí shell. Pro přímé spuštění je třeba zadat C-a :. Objeví se prompt a po napsání příkazu screen název_programu se vytvoří nové okno se spuštěným programem, nikoliv shellem.

Informace o aktuálním okně získáme stiskem C-a i, nebo C-a N. Pro stručný seznam oken lze použít C-a w.

Ukončení screenu

Pro ukončení okna stačí jakýkoliv příkaz, který uživatele odhlásí - tedy například stisk C-d. Pokud vypneme jiné okno než to s nejvyšším číslem, tak se samozřejmě žádná okna nepřečíslovávají. Jakmile je pak spuštěno pomocí C-a c nové okno, přednostně se zaplňují mezery vzniklé po vypnutých oknech.

Je-li stisknuto C-d v posledním zbylém okně, ukončí se celý screen.

Stiskem C-a k a následným potvrzením se okamžitě ukončí okno i s aplikacemi, které na něm běží. Ukončení všech oken najednou provedeme kombinací C-a C-\ a potvrzením.

Zamknutí screenu

Pokud si potřebujeme na chvilku odskočit, nemusíme se odhlašovat a zavírat všechny terminály. Postačí stisk C-a x. Objeví se výzva na zadání hesla a nikdo nepovolaný se k sezení nedostane.

Uzamknutí obrazovky vyvolané stiskem C-a x

Konzervace a znovupřipojení k sezení

Pokud ale máme ve screenu rozdělanou nějakou práci a musíme si odběhnout na delší dobu a odhlásit se, potřebujeme něco jiného než zámek. Tento problém řeší další funkce screenu - lze se odhlásit a později se znovu přihlásit a načíst uložený stav. Třeba i z jiného počítače.

Nesmíme však screen vypnout, ale pouze se odpojit. Odpojíme se stiskem C-a d, případně C-a D D pro odpojení a okamžité odhlášení. Když budeme chtít sezení znovu vyvolat ve stejném stavu, v jakém bylo uloženo, přidáme při spouštění screenu přepínač -r.

$ screen -r

V případech, kdy máme uloženo více než jedno sezení, nebude přidání -r stačit.

$ screen -r
There are several suitable screens on:
        8130.pts-4.jv           (Multi, attached)
        9013.pts-5.jv           (Multi, detached)
        9106.pts-5.jv           (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.
$

Je nutné zadat identifikátor sezení. Pokud zadáme jen jeho část, která však je jednoznačná, screen by měl poznat, o které sezení jde. Pro třetí sezení tedy můžeme tedy zadat celý název nebo jen 9106, ale už ne pts-5, protože by to nebylo jednoznačné.

$ screen -r 9106.pts-5.jv
$ screen -r 9106

Pokud je sezení ve stavu Attached, znamená to, že jsme na něj již někde připojeni. V tom případě musíme přidat parametr -d, který toto sezení odpojí.

$ screen -d -r

A nebo předat parametr -x, který se připojí bez ohledu na to, zda je stav sezení Detached. Získáme tak vícenásobný pohled na totéž sezení.

$ screen -x

Přehled všech sezení získáme přepínačem -list.

$ screen -list
There are screens on:
        8130.pts-4.jv           (Multi, attached)
        11082.pts-1.jv          (Attached)
2 Sockets in /var/run/screens/S-jv.

$

Význam slov v závorce je následující:

Přenos textu mezi jednotlivými okny

Přenos textu znamená označení jakéhokoliv výstupu v okně a jeho následné uložení do bufferu. V jakémkoliv okně potom můžeme obsah bufferu vyvolat.

Ale ještě před tím, než začneme s přenosem textu, si zkusme v terminálu odrolovat o část výstupu nahoru. Je to možná překvapující, ale výstup je smíchán z výstupů všech oken, která byla v daném pořadí zobrazena. Tento problém bude odstraněn automaticky přepnutím do kopírovacího (copy/scrollback) režimu.

Pro spuštění tohoto režimu stiskněme C-a [. Nyní se ve výstupu můžeme pohybovat jako je tomu v editoru vi (hjkl apod.). Samozřejmostí jsou číselné prefixy určující počet opakování. K dispozici by měly být i kurzorové klávesy, PageUp a PageDown.

Již se umíme pohybovat v historii výstupu, zbývá nám tedy jeho část zkopírovat do bufferu. Najedeme kurzorem na počáteční znak, který chceme kopírovat, stiskneme mezerník, dále kurzor přesuneme na koncovou pozici a opět stiskneme mezerník. Po dokončení by se ve stavovém řádku mělo objevit něco jako Copied 44 characters into buffer.

Mimo mezerníku a kláves pro pohyb lze používat i tyto tři zkratky:

KlávesaVýznam
xskočí na 2. konec výběru - tímto způsobem lze posunovat oba konce výběru
yoznačuje po řádcích
woznačuje po slovech

Pak není nic jednoduššího než přejít do okna, na jehož vstup chceme obsah bufferu poslat, a stisknout C-a [. Obsah bufferu se smaže až dalším kopírováním, takže ho lze použít opakovaně.

Spíše než pro kopírování výstupu na vstup se používá kopírování do souboru. Pokud místo koncového mezerníku stiskneme C-a >, zapíše se označená oblast do souboru /tmp/screen-exchange.

Když už existuje C-a >, pak jistě každého napadne, že by mohla existovat i zkratka C-a < pro zápis do bufferu. Skutečně je tomu tak. Pomocí ní lze do bufferu nakopírovat obsah souboru /tmp/screen-exchange. Soubor /tmp/screen-exchange smažeme pomocí C-a =.

/tmp/screen-exchange lze samozřejmě nahradit za jiný soubor příkazem C-a : bufferfile soubor. Posloupností příkazů C-a : bufferfile soubor, C-a <, C-a ] načteme do bufferu obsah souboru. To už je však poněkud krkolomné.

Rozdělení okna na regiony

V případech, kdy potřebujeme sledovat více než jedno okno současně, se bude hodit další z funkcí screenu, která umožňuje rozdělit okno horizontálně na několik oblastí. V každé můžeme mít zobrazené jiné okno. Okno se dělí příkazem C-a S a mezi regiony se přepíná C-a TAB. Zavření regionu (nikoliv okna) zajišťuje stisk C-a X a zavření všech regionů mimo aktuálního C-a Q.

Rozdělení terminálu na 2 regiony

Pomocí příkazu C-a : resize argument lze měnit velikost jednotlivých regionů. Jako argument lze zadat číslo (nová výška), číslo se znaménkem (změna aktuálního stavu) nebo znak rovnítka (vyrovnání výšek).

Sledování aktivity a ticha

Další praktickou vymožeností, se kterou se můžeme u screenu setkat je monitoring neaktivních oken. Pokud nám v jednom okně běží překlad, v dalším probíhá zdlouhavé hledání souboru na disku a v třetím pracujeme, je dost nepohodlné čas od času nahlížet, zda již skončil překlad nebo byl nalezen soubor. Rozdělení okna na 3 regiony by zas zbytečně zabralo příliš prostoru. Proto má screen další funkci - upozornění na aktivitu resp. ticho.

V případě překladu necháme sledovat ticho (silence). To znamená, že jakmile po určitý časový interval (implicitně 30 sekund, lze přenastavit příkazem C-a : silencewait počet_sekund) program nevyprodukuje žádný výstup, screen nás hláškou Window 1: silence for 30 seconds ve stavovém řádku upozorní, že překlad byl (pravděpodobně) ukončen.

Podobně funguje upozornění na aktivitu. V okně, ve kterém probíhá hledání, stiskneme C-a M. Pokud je nalezen nějaký soubor, budeme o tom neprodleně upozorněni hláškou Activity in window 2. Po obdržení informace o tichu nebo aktivitě lze stisknout C-a pro okamžitý přesun do tohoto okna.

Sdílení sezení více uživateli

Možnosti screenu jsou opravdu netušené, což potvrzuje jeho další schopnost. Několik lidí, každý sedící v teple svého domova, mohou pomocí screenu v reálném čase sdílet totéž sezení.

Význam to má například tehdy, pokud potřebujeme někomu vysvětlit, jakým způsobem se v systému řeší daná věc. Screen umožňuje bez nutnosti fyzické přítomnosti celý problém názorně předvést.

Víceuživatelský režim pro aktuální sezení zapneme stiskem C-a : a následným zadáním příkazu multiuser on do promptu.

Nyní máme zapnutý víceuživatelský režim (ve výpisu sezení se objeví slovo multi), ale nikdo zatím nemá právo k našemu sezení přistupovat. Můžeme udělovat tři druhy práv. Pro čtení (druhá strana může pouze sledovat činnost), zápis (povoleno zadávat vstup) a vykonávání příkazů.

Pro udělení všech práv zadejme C-a : addacl uživatelé, kde uživatelé je seznam uživatelů, oddělených čárkami. Tito uživatelé nyní mohou ve screenu dělat cokoliv, takže udělování plných práv používejme velice obezřetně

addacl user je synonymem pro chacl user +rwx "#?". chacl má tři argumenty - seznam uživatelů, práva a činnosti a okna, na které se práva vztahují. # je zkratka pro všechna okna, ? pro všechny příkazy a * pro všechny uživatele. Pro udělení práv pouze pro čtení slouží příkaz chacl user +r-wx "#". Má-li uživatel právo k vykonávání příkazů, může také měnit práva.

Nyní, když máme screen nastaven pro víceuživatelský přístup, se k němu můžeme připojit. Je třeba zadat příkaz ve formátu

$ screen -r vlastník_sezení/[sessionname]

Sessionname je implicitně řetězec ve tvaru pid.tty.host. Pojmenovat sessionname jinak je možné přes přepínač -S při jejím vytváření nebo později příkazem C-a : sessionname nové_jméno.

Připojíme se na sezení 8130.pts-4.jv k uživateli user.

$ screen -r user/8130.pts-4.jv

Pokud není otevřených více sezení půjde i

$ screen -r user/

Nyní jsme připojeni k sezení uživatele user a můžeme vykonávat činnosti podle přidělěných práv.

Seznam uživatelů připojených k sezení získáme příkazem C-a *. Uživatelé jednoho sezení si mohou posílat zprávy příkazem C-a : wall zpráva.

Ukažme si 2 nejčastější problémy při připojování k cizímu sezení. V případě, že se pokoušíme přistupovat k sezení, které nemá povolen víceuživatelský režim, se zobrazí:

$ screen -r user/
There is a screen on:
        12159.8130.pts-4.jv (Private)
There is no screen to be attached.
$

Pokud víceuživatelský režim aktivován je, ale nemáme práva k přístupu, objeví se hláška Access to session denied.

Konfigurační soubory

V konfiguračních souborech je uložena posloupnost příkazů, které mají být automaticky provedeny po spuštění screenu.

Jako globální konfigurační soubor je aplikován soubor /usr/local/etc/screenrc, případně /etc/screenrc. Dále se použije buď uživatelský soubor, jehož jméno je v proměnné prostředí $SCREENRC - implicitně $HOME/.screenrc a nebo soubor specifikovaný přepínačem -c.

Budeme-li například chtít implicitně zapnout víceuživatelský režim a přenastavit časový limit pro sledování ticha, do ~/.screenrc přidáme řádky

multiuser on
silencewait 10

Prázdně řádky a řádky začínající # (komentáře) jsou v konfiguračních souborech ignorovány.

Další zdroje

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=1100