Předchozí | Obsah | Další
V předchozí lekci jsme se zabývali některými důsledky toho, že Linux je víceuživatelský operační systém. V této lekci prozkoumáme víceúlohový charakter Linuxu a způsob jeho ovládání pomocí rozhraní příkazového řádku.
Jako každý víceúlohový operační systém, i Linux spouští více,souběžných procesů. No, každopádně se jeví jako souběžné. Ve skutečnosti může jedno procesorové jádro vykonávat vždy jen jeden proces, ale jádro Linuxu dokáže každému procesu poskytnout svůj čas a každý z nich vypadá, že běží současně.
K ovládání procesů se používá několik příkazů. Jsou to následující:
-
ps
– výpis procesů běžících v systému -
kill
– vyslání signálu jednomu nebo více procesům (obvykle pro „zabití“ procesu) -
jobs
– alternativní způsob výpisu vlastních procesů -
bg
– výpis vlastních procesů -
bg
– vyslání signálu jednomu nebo více procesům (obvykle pro „zabití“ procesu). umístit proces na pozadí -
fg
– umístit proces do popředí
Praktický příklad
Ačkoli se může zdát, že toto téma je poněkud nepřehledné, může být pro běžného uživatele, který většinou pracuje s grafickým uživatelským rozhraním, velmi praktické. Ačkoli to nemusí být zřejmé, většinu (ne-li všechny) grafické programy lze spouštět z příkazového řádku. Zde je příklad: existuje malý program dodávaný se systémem X Window s názvem xload, který zobrazuje graf znázorňující zatížení systému. Tento program můžeme spustit zadáním následujícího příkazu:
xload
Všimněte si, že se objeví malé okno xload
azačne zobrazovat graf zatížení systému. V systémech, kde xload
není k dispozici, zkuste místo toho použít gedit
. Všimněte si také, že se naše výzva po spuštění programu znovu neobjevila. Shell čeká na dokončení programu, než se vrátí řízení. Pokud zavřeme okno xload
, program xload se ukončí a výzva se vrátí.
Zavedení programu na pozadí
Nyní, abychom si trochu usnadnili život, spustíme program xload znovu, ale tentokrát ho umístíme na pozadí, takže se výzva vrátí. Za tímto účelem spustíme xload takto:
xload &
1223$V tomto případě se výzva vrátila, protože proces byl umístěn do pozadí.
Teď si představte, že jsme zapomněli použít symbol „&“ pro umístění programu do pozadí. Ještě je tu naděje. Můžeme napsat Ctrl-z
a proces bude pozastaven. Můžeme si to ověřit tím, že uvidíme, že okno programu je zamrzlé. Proces stále existuje, ale je nečinný. Chcete-li obnovit procesna pozadí, zadejte příkaz bg
(zkratka propozadí). Zde je příklad:
xload
+ Zastaveno xload$ bg
+ xload &Seznam běžících procesů
Teď, když máme proces na pozadí, by bylo užitečné zobrazitseznam spuštěných procesů. K tomu můžeme použít buď příkazjobs
, nebo výkonnější příkaz ps.
jobs
+ Spuštění xload&$ ps
PID TTY TIME CMD1211 pts/4 00:00:00 bash1246 pts/4 00:00:00 xload1247 pts/4 00:00:00:00 ps$Zabití procesu
Předpokládejme, že máme program, který přestane reagovat; jak se ho zbavíme? Samozřejmě použijeme příkaz kill
. Vyzkoušejme si to na příkazu xload
. Nejprve musíme identifikovatproces, který chceme zabít. K tomu můžeme použít buď jobs
, nebops
. Pokud použijeme úlohy, dostaneme zpět číslo úlohy. Při použití ps
dostaneme identifikační číslo procesu (PID). Provedeme to bothways:
xload &
1292$ jobs
+ Spuštěno xload&$ kill %1
$ xload &
1293 Ukončeno xload$ ps
PID TTY TIME CMD1280 pts/5 00:00:00 bash1293 pts/5 00:00:00 xload1294 pts/5 00:00:00 ps$ kill 1293
+ Ukončeno xload$Něco více o kill
Příkaz kill
se sice používá k „zabíjení“ procesů, ale jeho skutečným účelem je posílat procesům signály. Většinou je cílem signálu říci procesu, aby odešel, ale je toho víc. Programy (pokud jsou správně napsány) naslouchají signálůmz operačního systému a reagují na ně, nejčastěji proto, aby umožnily nějakýzpůsob ukončení. Například textový editor může poslouchat jakýkoli signál, který signalizuje, že se uživatel odhlašuje nebo že se počítač vypíná. Když tento signál obdrží, mohl by před ukončením uložit rozpracovanou práci. Příkaz kill
může procesům posílat různé signály. Zadáním příkazu:
kill -l
vypíše seznam signálů, které podporuje. Mnohé jsou spíše obskurní,ale několik se jich hodí znát:
Signál # | Název | Popis |
1 | SIGHUP | Signál zavěšení. Programy mohou naslouchat tomuto signálu a jednat podle něj. Tento signál je vyslán procesům běžícím v terminálu při jeho zavření. |
2 | SIGINT | Signál přerušení. Tento signál se dává procesům za účelem jejich přerušení. Programy mohou tento signál zpracovat a jednat podle něj. Tento signál můžeme také vydat přímo zadáním Ctrl-c v okně terminálu, kde je program spuštěn. |
15 | SIGTERM | Signál ukončení. Tento signál se dává procesům za účelem jejich ukončení. Programy opět mohou tento signál zpracovat a jednat podle něj. Jedná se o výchozí signál vysílaný příkazem kill , pokud není zadán žádný signál. |
9 | SIGKILL | Signál ukončení. Tento signál způsobí okamžité ukončení procesu jádrem systému Linux. Programy nemohou tomuto signálu naslouchat. |
Předpokládejme nyní, že máme program, kterýje beznadějně zavěšený, a chceme se ho zbavit. Uděláme to takto:
- Pomocí příkazu
ps
zjistíme id procesu (PID), který chceme ukončit. - Vydáme příkaz
kill
pro tento PID. - Pokud se proces odmítá ukončit (tj, ignoruje signál), posílejte stále ostřejší signály, dokud se neukončí.
ps x | grep bad_program
PID TTY STAT TIME COMMAND2931 pts/5 SN 0:00 bad_program$ kill -SIGTERM 2931
$ kill -SIGKILL 2931
V uvedeném příkladu jsme použili příkaz ps
s volbou x pro výpis všech našich procesů (i těch, které nebyly spuštěny z aktuálního terminálu). Kromě toho jsme výstup příkazu ps vložili do příkazu grep
, abychom vypsali pouze seznam programů, které nás zajímají. Dále jsme použili příkaz kill k vyslání signálu SIGTERM problematickému programu.Ve skutečné praxi se to častěji dělá následujícím způsobem, protože výchozím signálem vysílaným pomocí kill
je SIGTERM a kill může místo názvu signálu použít i číslo signálu:
kill 2931
Pokud se proces neukončí, vynuťte ho signálem SIGKILL:
kill -9 2931
To je ono!
Tímto končí série lekcí „Učení se shellu“. V příštím díle, „Psaní skriptů shellu“, se podíváme na to, jak automatizovat úlohy pomocí shellu.
Další četba
- Podrobnější zpracování tématu najdete v kapitole 10 knihy Příkazový řádek Linuxu.
- 1963 Timesharing: A Solution to Computer Bottlenecks, fascinující video na YouTube od Computer History Museum popisující první operační systém timesharing a jeho fungování. Je to v podstatě stejná metoda, jakou používají všechny moderní počítače.