Operační systém Unix je velmi výkonný nástroj pro ty, kdo jej umí používat. V této kapitole si popíšeme pokročilejší techniky práce s příkazovým procesorem bash.
V předcházející kapitole jsme se naučili pracovat s příkazy pro manipulaci se soubory. Příležitostně se může stát, že budete chtít pracovat s více soubory najednou. Například budete chtít zkopírovat všechny soubory začínající posloupností “data” do adresáře ~/backup. Můžete to udělat tak, že použijete několikrát příkaz cp, nebo v jednom příkazu cp uvedete seznam všech souborů, které se mají kopírovat. Oba způsoby jsou těžkopádné a jistě vám seberou hodně času. Navíc máte velkou šanci udělat chybu.
Na následujícím příkladě si uvedeme daleko elegantnější postup:
/home/larry/report# ls -F
1993-1 1994-1 data1 data5
1993-2 data-new data2
/home/larry/report# mkdir ~/backup
/home/larry/report# cp data* ~/backup
/home/larry/report# ls -F ~/backup
data-new data1 data2 data5
/home/larry/report#
Z uvedeného příkladu vidíte, že po zadání hvězdičky zkopíroval příkaz cp všechny soubory začínající řetězcem data do adresáře ~/backup. Zkuste uhodnout, jak bude fungovat příkaz cp d*w ~/backup
Rozhodně dobrá otázka. Příkazový interpret bash je schopen interpretovat jisté znaky, kterým se říká pseudoznaky (wildcards). Znak hvězdička (*) je interpretován tak, že za něj dosadí jakoukoliv posloupnost znaků. Proto příkaz z našeho příkladu cp data* ~/backup byl interpretován jako příkaz cp data-new data1 data2 data5 ~/backup.
Abychom ještě lépe ilustrovali interpretaci znaku hvězdička, uvedeme si nový jednoduchý příkaz echo, který zkopíruje své parametry jako text na obrazovce.
/home/larry# echo Hello!
hello!
/home/larry# echo How are you?
How are you?
/home/larry# cd report
/home/larry/report# ls -F
1993-1 1994-1 data1 data5
1993-2 data-new data2
/home/larry/report# echo 199*
1993-1 1993-2 1994-1
/home/larry/report# echo *4*
1994-1
/home/larry/report# echo *2*
1993-2 data2
/home/larry/report#
Jak sami vidíte, příkazový procesor rozšířil hvězdičku, vybral všechny soubory vyhovující specifikaci s hvězdičkou a předal je programu, který byl zadán ke spuštění. Naskýtá se přirozená otázka. Co se stane, když specifikaci s hvězdičkou nevyhovuje žádný soubor? Vyzkoušejte si například příkaz echo /rc/fr*og a uvidíte - příkazový procesor předá specifikaci přesně tak, jak byla zadána (žádnou interpretaci hvězdičky neprovede).
Ostatní příkazové procesory, například tcsh, se chovají jinak - nepředávají přesnou specifikaci, ale vypíší zprávu No match. Uveďme si příklad s příkazovým procesorem tcsh:
mousehouse>echo /rc/fr*og
echo: No match.
mousehouse>
Také vás asi napadá otázka, zda je možné pomocí příkazu echo zobrazit například data* (a nikoliv seznam souborů vyhovujících specifikaci data*). Řešení je jednoduché, stačí požadovaný text uzavřít do uvozovek. Například:
/home/larry/report# echo "data*" mousehouse>echo "data*"
data* nebo data*
/home/larry/report# mousehouse>
Kromě znaku hvězdičky je příkazový procesor schopen interpretovat jako speciální znak také znak otazník. Uvede-li se ve specifikaci otazník, pak to znamená, že má být nahrazen právě jedním znakem. Například příkaz ls /etc/?? zobrazí všechny soubory v adresáři /etc, jejichž jména se skládají právě ze dvou znaků.
Někdy se stane, že napíšete v příkazovém řádku příkazového interpretu bash dlouhý příkaz a pak si všimnete, že jste udělali chybu. Samozřejmě můžete postupně smazat všechny znaky, až se dostanete k chybně zadanému znaku, ale pak budete muset celý zbytek příkazu znovu psát. Příkazový interpret bash umožňuje používat kurzorové klávesy (šipka vlevo a šipka vpravo), pomocí kterých si můžete nastavit kurzor na chybně zadaný znak a opravit jej.
Dále existuje řada speciálních klávesových zkratek, pomocí nichž můžete příkazový řádek editovat. Tyto klávesové zkratky jsou většinou podobné příkazům používaným v editoru Emacs. Například kombinace Ctrl+T provede výměnu dvou sousedních znaků.
Popis většiny důležitých klávesových zkratek najdete v kapitole 8, která je věnována editoru Emacs.
Další vynikající vlastnost příkazového procesoru bash spočívá v tzv. doplňování příkazových řádků. Podívejme se na následující příklad.
/home/larry# ls -F
this-is-a-long-file
/home/larry# cp this-is-a-long-file shorter
/home/larry# ls -F
shorter this-is-a-long-file
/home/larry#
Samozřejmě je velmi nepohodlné a namáhavé vypisovat každý znak jména souboru thisis-a-long-file pokaždé, když chcete tento soubor zpřístupnit. Vytvořte si takový soubor, například příkazem cp /etc/passwd this-is-a-long-file. Nyní si ukážeme, jak zadat předcházející příkaz rychleji a s menším rizikem, že uděláme chybu.
Místo vypisování celého jména souboru zadejte cp th a pak stiskněte klávesu Tab. Jako mávnutím kouzelného proutku se vám celé jméno souboru objeví v příkazovém řádku a vám již stačí napsat shorter. Příkazový procesor bash neumí bohužel číst vaše myšlenky, proto jméno souboru shorter musíte napsat sami.
Když stisknete klávesu Tab, příkazový interpret bash se pokusí najít soubor, který začíná znaky, jež jste doposud napsali. Když například napíši /usr/bin/ema a pak stisknu Tab, příkazový procesor bash najde soubor /usr/bin/emacs. Když však napíši /usr/bin/ld a pak stisknu klávesu Tab, příkazový interpret pípne, aby mě upozornil, že našel více souborů. Skutečně, v adresáři /usr/bin jsou soubory ld, ldd a ld86.
Jestliže se pokoušíte doplnit jméno souboru a příkazový procesor pípne, pak můžete znovu stisknout klávesu Tab a objeví se vám seznam všech nalezených souborů. Proto nemusíte znát přesně jména svých souborů, příkazový procesor vám je vždy tímto způsobem připomene.
Zkuste si provést příkaz, který vypíše seznam všech souborů v adresáři /usr/bin: ls /usr/bin. Adresář /usr/bin obsahuje velké množství souborů, proto po zobrazení jejich jmen zůstane na obrazovce jen několik a ostatní “utečou” nahoru. Jak tento problém řešit?
Operační systém Unix nabízí programátorům velmi jednoduchý způsob zápisu na terminál. Pokud nějaký program něco vypisuje na vaši obrazovku, pak používá tzv. standardní výstup (standard output). Standardní výstup se zkracuje zkratkou stdout a slouží k předávání informací uživateli. Na druhé straně existuje standardní vstup (standard input), který slouží k předávání informací od uživatele. Samozřejmě je možné, aby program komunikoval s uživatelem bez použití standardního vstupu a výstupu, ale většina programů, kterými se zabýváme v této knize, standardní vstup a standardní výstup používá.
Například příkaz ls vypisuje seznam adresářů a souborů na standardní výstup, jenž je normálně spojen s terminálem. Příkazový interpret bash čte vámi zadané příkazy ze standardního vstupu.
Programy také mohou zapisovat do tzv. standardního chybového výstupu (standard error). Standardní chybový výstup je téměř výlučně spjat s terminálem, proto mohou být uživatelé informováni o případných chybách.
V následujících odstavcích si ukážeme, jak využívat standardní vstup a standardní výstup v konstrukcích, kterým se říká přesměrování vstupu, přesměrování výstupu a roura vstupu/výstupu.
Velmi důležitou vlastností operačního systému Unix je schopnost přesměrovat výstup. Tato vlastnost vám umožní uložit výsledky příkazu do souboru nebo vytisknout na tiskárně. Jestliže chcete například přesměrovat výstup z příkazu ls /usr/bin do souboru, přidejte na konec příkazu znak > a za něj uveďte jméno souboru (nejlépe neexistujícího). Například:
/home/larry# ls
/home/larry# ls -F /usr/bin > listing
/home/larry# ls
listing
/home/larry#
Jak vidíte, seznam souborů se nezobrazil na terminálu, ale místo toho se vytvořil ve vašem domovském adresáři nový soubor listing. Zkusme se na tento soubor podívat pomocí příkazu cat. Jestli si vzpomínáte, příkaz cat se jevil jako zbytečný příkaz, který zkopíroval na obrazovku (standardní výstup) to, co jste napsali (standardní vstup). Příkaz cat také umí vypsat obsah souboru na standardní výstup, pokud tento soubor uvedete jako parametr:
/home/larry# cat listing
...
/home/larry#
Soubor listing nyní obsahuje přesný výstup příkazu ls /usr/bin, tedy seznam všech souborů v adresáři /usr/bin. To je v pořádku, ale stále to neřeší náš původní problém.
Nyní je příkaz cat o něco zajímavější - lze jej použít spolu s přesměrováním výstupu. Co asi udělá příkaz cat listing > newfile? Přesměrování > newfile pro příkazový interpret znamená toto: “vezmi celý výstup z příkazu a ulož jej do nového souboru”. Výstup z příkazu cat listing je ovšem soubor listing. Jinými slovy, pravě jsme popsali jeden ze způsobů kopírování souborů, i když ne příliš efektivní.
Co asi udělá příkaz cat > fox? Příkaz cat čte data ze standardního vstupu (v tomto případě terminálu) a kopíruje je na standardní výstup, dokud nenarazí na znak konce souboru Ctrl+D. V tomto případě bude standardní vstup přesměrován do souboru fox. Nyní nám příkaz cat slouží jako základní editor:
/home/larry# cat > fox
The quick brown fox jumps over the lazy dog.
Stiskni Ctrl-d
Právě jste vytvořili soubor se jménem fox obsahující větu “The quick brown fox jumps over the lazy dog.” Další důležitou funkcí příkazu cat je spojování souborů dohromady. Příkaz cat bude vypisovat každý soubor, který mu byl předán jako parametr. Proto například příkaz cat listing fox nejprve vypíše seznam souborů adresáře /usr/bin a nakonec vypíše naši hloupou větu. Příkaz cat listing fox > listandfox vytvoří nový soubor tvořený obsahem souborů listing a fox.
Tak, jako je možné přesměrovat standardní výstup, je možné přesměrovat i standardní vstup. Místo toho, aby program četl z klávesnice, bude číst ze souboru. Protože se přesměrování vstupu vztahuje k přesměrování výstupu, je přirozené pro něj vyhradit znak <. Tento znak se také uvádí za příkazem, který chcete realizovat.
Přesměrování vstupu je užitečné zejména v případě, kdy máte soubor obsahující data a program, který data čte se standardního vstupu. Na druhé straně platí, že většina programů vyžaduje specifikaci souboru se vstupními daty, proto se přesměrování vstupu nepoužívá tak často, jako přesměrování výstupu.
Řada příkazů v operačním systému Unix produkuje velké množství informací. Jak jsme si již ukázali, příkaz cp /usr/bin vyprodukuje příliš mnoho informací, než aby mohly být zobrazeny na terminálu. Abyste si mohli prohlédnout všechny informace z příkazů, jako je ls /usr/bin, budete muset použít další důležitý příkaz operačního systému Unix, který má název more.
Příkaz more způsobí pozastavení výpisu na obrazovku, jakmile se celá obrazovka zaplní. Například příkaz more < /etc/rc zobrazí stejným způsobem soubor /etc/rc jako příkaz cat, ale s tím rozdílem, že výpis pozastaví po každém naplnění obrazovky.
Příkaz more také můžete použít ve tvaru more /etc/rc, což představuje normální způsob jeho použití.
Co je však platné, že příkaz more umožňuje zobrazit více informací, než se vleze na obrazovku? Příkaz more < ls /usr/bin nebude fungovat, protože přesměrování vstupu funguje pouze se soubory a nikoliv s příkazy. Budete tedy muset postupovat takto:
/home/larry# ls /usr/bin > temp-ls
/home/larry# more temp-ls
...
/home/larry# rm temp-ls
Naštěstí nabízí operační systém Unix mnohem elegantnější způsob. Stačí, když zadáte příkaz ls /usr/bin | more. Znak | indikuje tzv. rouru. Roura v operačním systému Unix řídí tok dat. Užitečnost roury ještě více vzrůstá ve spojení s dalšími nástroji, kterým se říká filtry. Filtr je program, který čte standardní vstup, nějakým způsobem jej modifikuje a odešle jej na standardní výstup. Příkladem filtru je právě příkaz more - čte data ze standardního vstupu, zobrazuje je na standardní výstup (obrazovku) a umožňuje vám prohlédnout celý soubor. more však není úplně dokonalý filtr, protože jeho výstup není vhodný pro to, aby mohl být předán jako vstup jinému programu.
Mezi další filtry patří příkazy cat, sort, head a tail. Chcete-li například přečíst pouze prvních deset řádků výstupu z příkazu ls, můžete použít příkaz ls /usr/bin | head.
Řízení úloh (job control) představuje možnost zajistit, aby daný proces (proces není v podstatě nic jiného, než běžící program) běžel na pozadí nebo naopak, aby běžel na popředí. Jinými slovy, zřejmě potřebujete nástroje k tomu, abyste mohli dlouhodobě běžící program přesunout do pozadí a tak mohli pracovat na jiných věcech, a přitom měli možnost do programu běžícího na pozadí kdykoliv zasahovat. Tímto nástrojem je v operačním systému Unix příkazový procesor. Ukážeme si, jak jej využívat k řízení úloh.
V souvislosti s řízením úloh jsou v operačním systému Unix vyhrazena dvě důležitá klíčová slova. První z nich je fg pro běh programů v popředí a druhé je bg pro běh programů na pozadí. Abychom vyzkoušeli, jak fungují, použijeme příkaz yes:
/home/larry# yes
Po spuštění příkazu yes se na levé straně obrazovky vypisuje velkou rychlostí písmeno “y”.
Pokud byste chtěli příkaz yes zastavit, stiskli byste klávesu Ctrl+C. Místo toho však stiskněte klávesu Ctrl+Z. Nyní se vám bude zdát, že se provádění příkazu yes zastavilo. Na obrazovce se však objeví následující zpráva:
[1] Stopped yes
To znamená, že proces yes byl pozastaven. Pozastavený proces můžete obnovit pomocí příkazu fg, který jej aktivuje v popředí a program poběží dále. Zatímco je program pozastaven, můžete realizovat další příkazy. Než zadáte příkaz fg, zkuste si zadat několikrát jiný příkaz, například ls.
Jakmile se příkaz yes “vrátí” do popředí, bude pokračovat ve výpisu písmen “y” stejnou rychlostí jako na počátku po jeho spuštění. Nemusíte mít obavy, že se výstup z programu, který byl pozastaven, někam ztratí. Je-li program pozastaven uvedeným způsobem, pak až do okamžiku, kdy jej obnovíte, žádný výstup neprodukuje. Nyní stiskněte klávesu Ctrl+C a program yes zrušte.
Nyní se vrašme k předcházející zprávě:
[1]+ Stopped yes
Číslo v hranatých závorkách je pořadové číslo úlohy, na které se můžete odvolávat, kdykoliv bude chtít na běhu této úlohy něco změnit. Číslo úlohy se zavádí z toho důvodu, aby existovalo nějaké rozlišení mezi více současně běžícími úlohami. Znak “+” za hranatými závorkami indikuje, že uvedená úloha je aktuální úlohou, tedy úlohou, jež byla jako poslední převedena z popředí na pozadí. Jestliže zadáte příkaz fg, pak do popředí převedete právě tu úlohu, která je označena znakem “Ctrl+”. Slovo Stopped znamená, že úloha byla pozastavena a nachází se ve zvláštním stavu - není zrušena, ale také není aktivní. Operační systém Linux ji uvedl do speciálního stavu, kdy může pokračovat v realizaci, jakmile bude zadán poísluiný příkaz. Jako poslední je uvedeno jméno procesu, tedy v našem případě yes.
Než pokročíme dále, zrušme tuto úlohu a nastartujme ji, tentokrát jiným způsobem. Příkaz ke zrušení úlohy se jmenuje kill (doslova zabít, zničit) a používá se následujícím způsobem:
/home/larry# kill %1
[1]+ Stopped yes
/home/larry#
Zpráva, která se objevila na obrazovce (říká, že proces byl pozastaven) je zavádějící. Abychom zjistili, v jakém stavu se proces nachází (t.j. zda je aktivní, zmrazen nebo pozastaven), zadáme příkaz jobs:
/home/larry# jobs
[1]+ Terminated yes
/home/larry#
Až zde máte napsáno, v jakém stavu se úloha yes skutečně nachází - byla ukončena a nikoliv pozastavena. Je také možné, že zadáte příkaz jobs a vůbec žádná zpráva se nevypíše. To znamená, že na pozadí opravdu neběží žádná úloha. Jestliže jste právě zrušili nějakou úlohu a příkaz jobs nic nevypíše, pak jste ji zrušili úspěšně. Obvykle se ale objeví zpráva, že úloha byla ukončena (Terminated).
Nyní spusšme příkaz yes znovu, tentokrát následujícím způsobem:
/home/larry# yes > /dev/null
Pokud jste četli oddíl o přesměrování vstupu a výstupu, pak asi tušíte, že příkaz yes bude odesílat svůj výstup do souboru /dev/null. Soubor /dev/null má v operačním systému Unix speciální význam. Představuje “černou díru”, do které se ztratí jakékoliv množství informací, aniž by například hrozilo, že se zaplní váš pevný disk. Nemáte-li dostatek fantazie, pak si představte, že je ve vašem počítači vyvrtána díra, kterou proudí informace ven a ztrácejí se v hlubinách vesmíru.
Po zadání uvedeného příkazu se vám nevrátí nápověda příkazového řádku, ani se nebudou na obrazovce vypisovat písmena “y”. I když je výstup z příkazu yes přesměrován do souboru /dev/null, úloha stále běží na popředí. Jako obvykle ji můžete pozastavit pomocí klávesy Ctrl+Z. Pak se vám samozřejmě znovu objeví výzva příkazového řádku:
/home/larry# yes > /dev/null
[Příkaz "yes" běží, nyní stiskněme Ctrl+Z]
[1]+ Stopped yes > /dev/null
/home/larry#
Je nějaká možnost přesunout úlohu do pozadí tak, aby dále běžela a aby se nám objevila výzva příkazového řádku? K tomuto účelu slouží příkaz bg:
/home/larry# bg
[1]+ yes > /dev/null &
/home/larry#
Nyní byste měli věřit následujícímu tvrzení: po zadání příkazu bg běží proces yes > /dev/null dále, a to na pozadí. Poznáte to podle toho, že když v příkazovém řádku zadáte nějaký příkaz, například ls nebo stuff, bude jeho realizace poněkud zpomalena. Jiný efekt úlohy běžící na pozadí nemají. Nadále můžete v příkazovém řádku zadávat jakékoliv příkazy a proces yes > /dev/null poběží na pozadí a přitom bude výstup odesílat do “černé díry”.
Existují dvě možnosti, jak proces běžící na pozadí zrušit (doslova “zabít”). Buď použijete příkaz kill, nebo přesunete proces do popředí a ukončíte jej pomocí klávesy Ctrl+C. Vyzkoušíme si druhý způsob, abychom lépe pochopili vztah mezi příkazy fg a bg:
/home/larry# fg
yes > /dev/null
[Nyní běží proces opět v popředí. Stiskněte klávesu Ctrl+C a ukončete jej.]
/home/larry#
Jako další si vyzkoušíme spustit současně více procesů, například:
/home/larry# yes > /dev/null &
[1] 1024
/home/larry# yes | sort > /dev/null &
[2] 1026
/home/larry# yes | uniq > /dev/null
[nyní stiskněte klávesu Ctrl+Z]
[3]+ Stopped yes | uniq > /dev/null
/home/larry#
Určitě jste si všimli, že jsme na konec prvních dvou příkazů zapsali znak &. Pokud na konec příkazu zadáte znak &, příkazový procesor spustí úlohu hned od počátku na pozadí. Je to mnohem jednodušší, než spustit úlohu normálním způsobem, stisknout klávesu Ctrl+Z a pak zadávat příkaz bg. První dvě úlohy jsme tedy přímo spustili na pozadí. Třetí úloha je v tomto okamžiku pozastavena a tedy neaktivní. Jistě jste zpozorovali, že počítač nyní reaguje na další příkazy pomaleji, protože dvě běžící úlohy spotřebovávají jistý čas procesoru.
Zrušme nyní druhou úlohu, protože ta patrně výrazně snižuje výkon vašeho počítače. Mohli bychom použít příkaz kill %2, ale to by bylo příliš jednoduché. Místo toho zadejme následující příkazy:
/home/larry# fg %2
yes | sort > /dev/null
[Stiskněte klávesu Ctrl+C]
/home/larry#
Uvedený příklad demonstruje, že příkaz fg akceptuje parametry začínající znakem %. Ve skutečnosti jsme mohli použít následující posloupnost příkazů:
/home/larry# %2
yes | sort > /dev/null
[Stiskněte klávesu Ctrl+C]
/home/larry#
První příkaz bude opět fungovat, protože příkazový procesor interpretuje číslo úlohy jako požadavek, že má být úloha přenesena do popředí. Čísla úloh odlišuje od ostatních čísel právě pomocí znaku %. Nyní zadejte příkaz jobs, abyste věděli, které úlohy momentálně běží:
/home/larry# jobs
[1]- Running yes > /dev/null &
[3]+ Stopped yes | uniq > /dev/null
/home/larry#
Znak “-“ znamená, že úloha číslo 1 byla do pozadí přesunuta jako první v pořadí a bude jako druhá v pořadí přesunuta do popředí, pokud zadáte příkaz fg bez parametrů. Znak “+” znamená, že úloha číslo 3 bude do popředí přesunuta jako první v pořadí, pokud zadáte příkaz fg bez parametrů. Uvedené implicitní pořadí můžete změnit takto:
/home/larry# fg %1
yes > /dev/null
[nyní stiskněte klávesu Ctrl+Z]
[1]+ Stopped yes > /dev/null
/home/larry#
Pomocí uvedených příkazů jste pozastavili úlohu číslo 1 a změnili jste také pořadí priorit všech úloh. K jakým změnám doýlo? Na to vám odpoví příkaz jobs:
/home/larry# jobs
[1]+ Stopped yes > /dev/null
[3]- Stopped yes | uniq > /dev/null
/home/larry#
Nyní jsou obě úlohy pozastaveny (v obou případech jsme použili klávesu Ctrl+Z). Úloha číslo 1 je nyní na pozici první, pokud jde o pořadí, v jakém budou úlohy implicitně přenášeny do popředí. Je tomu tak z toho důvodu, že jsme úlohu nejprve přesunuli do popředí a pak ji pozastavili. Znak “Ctrl+” vždy označuje tu úlohu, která byla jako poslední pozastavena, když předtím běžela na popředí. Úlohu číslo 1 můžeme opět aktivovat tímto způsobem:
/home/larry# bg
[1]+ yes > /dev/null &
/home/larry# jobs
[1]- Running yes > /dev/null &
[3]+ Stopped yes | uniq > /dev/null
/home/larry#
Všimněte si, že úloha 1 nyní běží a u druhé úlohy se objevil znak “+”. Nakonec obě úlohy zrušíme, protože se už nemůžeme dále dívat na to, jak snižují výkon počítače:
/home/larry# kill %1 %2
[3] Terminated yes | uniq > /dev/null
/home/larry# jobs
[1]+ Terminated yes > /dev/null
/home/larry#
Jistě jste si všimli zpráv upozorňujících na ukončení úloh - jak se zdá, nic neumírá tiše. Tabulka 6.1 obsahuje stručný přehled o příkazech, které se vztahují k řízení úloh.
Především je nutné pochopit, že úlohy řídí příkazový procesor. Ve skutečnosti v systému neexistují programy jako fg, bg, jobs, & nebo kill. Tyto programy jsou vnitřními příkazy příkazového procesoru a jsou jeho součástí. (Výjimku někdy tvoří příkaz kill, který je v některých operačních systémech Unix implementován jako externí program. Pokud však jde o Linux, příkaz kill je integrován v příkazovém procesoru bash). Tento mechanismus řízení úloh je logický. Každý uživatel chce mít k realizaci úloh svůj prostor. Protože každý uživatel pracuje se svým příkazovým procesorem, je logické, aby příkazový procesor úlohy řídil.
Odtud dále vyplývá, že čísla úloh se vztahují právě k jednomu uživateli. Moje úloha číslo 1 bude zřejmě zcela odlišná od vaší úlohy číslo 1, a to i v případě, kdy budeme oba přihlášeni k témuž systému. Ve skutečnosti platí, že přihlásíte-li se do systému více než jednou, bude každý spuitiný příkazový procesor vlastnit unikátní datové struktury pro řízení úloh. Jako jediný uživatel tedy můžete mít několik zcela různých úloh s pořadovým číslem 1 běžících v různých příkazových interpretech.
fg %job |
Tento příkaz je příkazem příkazového procesoru a přesouvá úlohu do popředí. Chcete-li zjistit, která úloha se přesune implicitně jako první, zadejte příkaz jobs a podívejte se, která úloha je označena znakem “+”. Parametry: volitelným parametrem je číslo úlohy. Implicitní je úloha označená znakem “+”. |
& |
Pokud se znak “&” uvede na konec příkazového řádku, bude úloha spuštěna automaticky římo na pozadí. Pro takto spuitiný proces platí všechny metody řízení úloh, které jsme zde uvedli. |
bg %job |
Tento příkaz je příkazem příkazového procesoru a přesouvá úlohu do pozadí. Chcete-li zjistit, která úloha se přesune implicitně jako první, zadejte příkaz jobs a podívejte se, která úloha je označena znakem “Ctrl+”. Parametry: volitelným parametrem je číslo úlohy. Implicitní je úloha označená znakem “+”. |
kill %job PID |
Tento příkaz je příkazem příkazového procesoru a ukončuje úlohu, ať běží na pozadí nebo byla pozastavena. Pokaždé byste měli použít jako parametr číslo úlohy, kterému předchází znak %. Parametry: buď číslo úlohy, kterému předchází znak %, nebo PID (identifikační číslo procesu), pak znak % není nutné uvádět. Na jednom příkazovém řádku může být uvedeno více úloh, které se mají ukončit. |
jobs |
Tento příkaz je příkazem příkazového procesoru. Vypisuje informace o běžících úlohách a o úlohách, které byly pozastaveny. |
Ctrl+C |
Klávesová zkratka vyhrazená k bezpodmínečnému ukončení úlohy. Běžně se používá k ukončení úlohy běžící v popředí. Je však nutné upozornit na skutečnost, že ne všechny programy na tuto klávesovou zkratku reagují. |
Ctrl+Z |
Klávesová zkratka vyhrazená k pozastavení úlohy. Opět platí, že některé programy jej ignorují. Jakmile je jednou úloha pozastavena, může být znovu přesunuta do popředí nebo ukončena. |
Jediný bezpečný způsob, jak identifikovat proces, představuje identifikační číslo procesu (process identification number, zkratka PID). Každá úloha běžící v systému má svoje unikátní identifikační číslo procesu. Dva různí uživatelé mohou k odkazu na proces použít totéž identifikační číslo a pak mají jistotu, že se jedná o tentýž proces (samozřejmě za předpokladu, že jsou přihlášeni k témuž systému).
Podívejme se na další příkaz, který vám pomůže lépe pochopit význam identifikačních čísel procesů. Příkaz ps vypíše seznam všech běžících nebo pozastavených procesů, včetně vašeho příkazového procesoru. Tento příkaz má také několik voleb, z nichž nejdůležitějií jsou a, u a x. Zadáte-li volbu a, pak se vám zobrazí seznam všech procesů, t.j. procesů, které spustili i ostatní uživatelé. Pomocí volby x se zobrazí seznam těch procesů, které nejsou nijak svázány s terminálem.
Poslední volba u zajistí, že se vám zobrazí další užitečné informace o běžících nebo pozastavených procesech.
Jestliže chcete získat komplexní představu, co se ve vašem systému odehrává, zadejte příkaz ps -aux. (V novějších verzích je možno znaménko “-” vynechat a použít pouze příkaz ps aux.) Pak se můžete podívat, kolik paměti každý proces potřebuje (sloupec %MEM) a jak zatěžuje procesor (sloupec %CPU). Ve sloupci TIME je uveden celkový čas procesoru, který spuitiný proces spotřeboval.
Ještě jedna poznámka o identifikačním číslu procesu. Kromě parametru %číslo úlohy# můžete v příkazu kill použít identifikační číslo procesu. Spusšte příkaz yes > /dev/null na pozadí, pak spusšte příkaz ps a podívejte se na identifikační číslo náležící procesu yes. Toto identifikační číslo můžete také použít ke zrušení procesu yes.
Jestliže začnete programovat v jazyku C, pak se brzy dozvíte, že příkazy pro řízení úloh jsou interaktivní verze systémových volání fork a execl. Jedná se o příliš složité mechanismy, než abychom je zde mohli popsat. Pokud budete vytvářet programy, které jsou schopny spouštět více procesů, pak se s těmito systémovými funkcemi budete muset seznámit v příslušné dokumentaci.
Operační systém Linux podporuje tzv. virtuální konzoly. Jedná se o metodu, která budí dojem, že váš počítač není jedním počítačem ale několika počítači najednou. Linux je schopen spustit několik terminálů současně a přitom jsou všechny spojeny s jedním jádrem. Naštěstí je používání virtuálních konzol jednou z nejjednodušších záležitostí v operačním systému Linux.
Chcete-li si je vyzkoušet, stiskněte klávesu Alt a pak klávesu F2.
Najednou se vám objeví nová výzva k přihlášení se do systému. Nepodléhejte panice. Nyní pracujete s virtuální konzolou číslo 2. Přihlaste se a proveďte několik příkazů, abyste se přesvědčili, že nově nastartovaný příkazový procesor skutečně funguje. Budete-li se chtít vrátit do virtuální konzoly číslo 1, stiskněte opět klávesu Alt a pak F1. Nebo můžete vytvořit třetí konzolu pomocí kláves Alt a F3.
Operační systém Linux má implicitně povoleno šest virtuálních konzol. Pokud budete chtít vědět jak, prostudujte si manuál “Příručka správce operačního systému Linux”. Budete muset udělat nějaké úpravy v souborech v adresáři /etc. Šest virtuálních konzol však většině uživatelů stačí.
Začnete-li používat virtuální konzoly, brzy zjistíte, že jsou ideálním nástrojem k realizaci mnoha úkonů současně. Na první konzole můžete například provozovat editor Emacs, na druhé programy pro komunikaci s Internetem a na třetí můžete mít spuštěn příkazový procesor, kdybyste chtěli spustit ještě nějaký další program.