NOVINKA: Kurz kybernetické bezpečnosti s akreditací MŠMT, nyní již od 0 Kč. Staň se žádaným profesionálem. Zjisti více:
NOVINKA: Staň se datovým analytikem a získej jistotu práce, lepší plat a nové kariérní možnosti. Více informací:

Lekce 9 - Linuxový terminál (Bash) - Práce s procesy

V předešlém cvičení, Řešené úlohy k 6.-8. lekci základů Linuxu, jsme si procvičili nabyté zkušenosti z předchozích lekcí.

V tomto tutoriálu základů Linuxu se seznámíme s pojmy proces, úloha a úkol. Následně se podíváme na uspořádání procesů v Linuxu a naučíme se pracovat s příkazy pro jejich správu v terminálu.

Procesy v Linuxu

Linux je stejně jako Windows víceúlohový operační systém. Jednotlivé aplikace běží jako procesy, mezi které procesor rozděluje svůj čas nebo které běží paralelně na více jádrech. V procesech běží ještě vlákna, těmi se ale v této lekci zabývat nebudeme.

Pojmy úkol a úloha se v praxi často překrývají, v této lekci je budeme používat následovně:

  • Úkol (task) je jednotka vykonávané práce. Kombinací několika úkolů poté vzniká jedna úloha.
  • Úloha (job) je celková jednotka práce. Úlohu tvoří vždy série jednotlivých úkolů.

Proces

Proces je označení pro běžící program. Každý spuštěný program se v Linuxu stává procesem, kterému systém přidělí paměť a další prostředky.

Na jednom jádru procesoru může běžet v daný okamžik pouze jeden proces, ostatní jsou plánovány na další časové úseky. O přidělení procesoru rozhoduje jádro operačního systému.

Každý proces prochází následujícími stavy:

  • Nový (New) – proces je právě vytvářen,
  • Připravený (Ready) – čeká na přidělení procesoru,
  • Běžící (Running) – je právě vykonáván,
  • Čekající (Waiting/Blocked) – čeká na událost,
  • Ukončený (Terminated) – ukončil činnost, ale ještě může držet systémové prostředky.

Rodičovský proces

Rodičovský proces je proces, který vytvořil jeden nebo více potomků. Vztahy mezi procesy tak tvoří stromovou strukturu.

Potomek může od rodiče dědit například otevřené soubory nebo část paměti a po svém ukončení předává rodiči návratový kód.

Pojďme si rodičovský proces ukázat na konkrétním příkladu. Do terminálu zadáme příkaz ps -l, který vypíše seznam procesů aktuálního shellu společně s doplňujícími informacemi:

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0     8     1  0  80   0 -  2452 -      tty1     00:00:00 init
0 S     0     9     8  2  80   0 -  4531 -      tty1     00:00:00 bash
0 R     0    70     9  0  80   0 -  4646 -      tty1     00:00:00 ps

Ve výpisu se zaměříme zejména na sloupce PID (Process ID) a PPID (Parent Process ID). Můžeme si všimnout, že PID procesu bash je uveden jako PPID procesu ps. Je to proto, že z programu bash jsme spustili ps. Proces bash je tedy rodičovský proces pro ps, který je naopak jeho potomek.

Příkazem pstree zobrazíme celou stromovou strukturu procesů v systému.

systemd (hlavní systémový proces)

Všechny procesy v systému mají svého rodiče. Na vrcholu této struktury stojí proces systemd (PID 1), který se spouští při startu systému a následně spouští další systémové procesy.

Po zadání příkazu pstree si můžeme všimnout, že proces systemd je na vrcholu celé stromové struktury.

Daemon (procesy na pozadí)

Daemon je proces, který běží bez přímé interakce s uživatelem, pracuje na pozadí a stará se o chod operačního systému nebo poskytování služeb. Daemoni zajišťují například síťové služby, tiskové služby a podobně. Zpravidla je poznáme tak, že název procesu končí na d. Mezi nejznámější daemony patří systemd, crond spouštějící naplánované úlohy, sshd zajišťující šifrované přihlášení či ftpd umožňující přenos souborů.

Správa procesů v Linuxu

Nyní se naučíme používat základní příkazy pro správu procesů. Umožní nám zobrazit běžící procesy a lépe se zorientovat v tom, co se v systému právě děje.

Výpis procesů (ps)

Příkaz ps vypíše procesy spuštěné aktuálním shellem.

Pokud chceme zobrazit všechny běžící procesy v systému, použijeme kombinaci přepínačů aux:

ps aux

Získáme tak výpis všech aktuálně spuštěných procesů společně s podrobnějšími informacemi:

root         1  0.0  0.0   9788   528 ?        Ssl  16:35   0:00 /init
root        66  0.0  0.0  20224   908 ?        Ss   16:35   0:00 sshd: /usr/sbin
root        95  0.0  0.0   9808   308 tty1     Ss   20:32   0:00 /init
root        96  0.0  0.0  18124  3672 tty1     S    20:32   0:00 -bash
root       119  0.0  0.0  18664  1896 tty1     R    20:34   0:00 ps aux

Ve výpisu vidíme jednotlivé procesy včetně jejich identifikačního čísla PID, které slouží například k jejich ukončení.

PID je důležité, protože jedna aplikace může běžet vícekrát a systém by ji podle názvu nedokázal jednoznačně identifikovat.

Strom procesů (pstree)

Pro přehlednější zobrazení vztahů mezi procesy použijeme příkaz pstree, který vypíše procesy ve stromové struktuře:

init─┬─init───bash───pstree
     ├─sshd
     └─2*[{init}]

Díky tomu snadno uvidíme, které procesy jsou rodičovské a které jsou jejich potomci.

Úlohy v shellu (jobs)

Kromě příkazu ps můžeme k zobrazení procesů využít také příkaz jobs, který je součástí shellu.

Zobrazuje pouze úlohy, které jsme spustili v aktuálním terminálu:

jobs

Po spuštění příkazu neuvidíme žádné úlohy, pokud žádné neběží, spustíme tedy například editor gedit:

admin@itnetwork:~# gedit

Terminál je nyní obsazen běžícím procesem. Proces pozastavíme stisknutím klávesové zkratky Ctrl + Z:

admin@itnetwork:~# gedit
^Z
[1]+  Stopped                 gedit

Nyní můžeme příkazem jobs zobrazit seznam pozastavených úloh.

Spuštění na pozadí (bg)

Pomocí příkazu bg můžeme pozastavenou úlohu znovu spustit, tentokrát na pozadí:

admin@itnetwork:~# bg
[1]+ gedit &

Proces nyní běží na pozadí a terminál je opět k dispozici.

Úlohu můžeme na pozadí spustit ihned při jejím vytvoření přidáním znaku & na konec příkazu.

Přepnutí do popředí (fg)

Pomocí příkazu fg přeneseme úlohu zpět do popředí.

Můžeme zadat konkrétní úlohu pomocí jejího čísla:

admin@itnetwork:~# fg %1
gedit
█

Pokud příkaz spustíme bez parametru, přenese se do popředí poslední pozastavená nebo spuštěná úloha na pozadí.

Sledování procesů (top)

Příkaz top slouží ke sledování procesů v reálném čase. Umožňuje například řadit procesy podle využití procesoru, paměti a dalších parametrů:

top - 08:37:57 up 16:02,  0 users,  load average: 0.52, 0.58, 0.59
Tasks:   5 total,   1 running,   4 sleeping,   0 stopped,   0 zombie
%Cpu(s): 14.9 us,  3.1 sy,  0.0 ni, 81.8 id,  0.0 wa,  0.2 hi,  0.0 si,  0.0 st
MiB Mem :  16217.3 total,   6969.1 free,   9024.1 used,    224.0 buff/cache
MiB Swap:  28835.8 total,  28792.3 free,     43.4 used.   7062.5 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    1 root      20   0    9788    524    476 S   0.0   0.0   0:00.07 init
   66 root      20   0   20224    908    692 S   0.0   0.0   0:00.00 sshd
  192 root      20   0    9808    308    260 S   0.0   0.0   0:00.01 init
  193 root      20   0   18124   3672   3572 S   0.0   0.0   0:00.09 bash
  214 root      20   0   18920   2160   1528 R   0.0   0.0   0:00.00 top

V horní části vidíme souhrnné informace o systému, například počet procesů nebo využití paměti. Níže se nachází seznam běžících procesů.

Význam jednotlivých sloupců:

PID Identifikační číslo procesu.
USER Uživatel, pod kterým je proces spuštěn.
PR Priorita plánování úkolu. Hodnota rt znamená, že úloha běží s prioritou plánování v reálném čase.
NI Priorita procesu (tzv. nice value). Kladná hodnota symbolizuje nízkou prioritu, záporná hodnota pak vysokou prioritu.
VIRT Celkové množství virtuální paměti využité procesorem.
RES Celkové množství skutečné paměti využité procesorem.
SHR Celkové množství sdílené paměti využité procesorem.
S Aktuální stav procesu.
%CPU Procentuální využití procesoru jednotlivých procesů.
%MEM Procentuální využití operační paměti jednotlivých procesů.
TIME+ Celkový CPU čas procesu.
COMMAND Název spuštěného procesu.

Sledování ukončíme klávesou q.

Pokud chceme vyhledat konkrétní proces, použijeme například příkaz top | grep sshd.

Ukončení procesů (kill)

Poslední příkaz, který si v souvislosti s procesy zmíníme, je kill. Tento příkaz slouží k ukončení běžícího procesu pomocí jeho identifikačního čísla (PID).

Příkaz může vysílat desítky různých signálů. Všechny signály vypíšeme přidáním přepínače -l:

kill -l

Výpis příkazu vypadá následovně:

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

Signál můžeme specifikovat několika způsoby:

  • číslem (kill -15 PID),
  • názvem s předponou (kill -SIGTERM PID),
  • nebo názvem bez předpony (kill -TERM PID).

Výchozí signál je SIGTERM (terminate), který se snaží proces ukončit korektně. Pokud ale příkazem top například zjistíme, že proces s PID 200 nadměrně vytěžuje procesor nebo nereaguje, můžeme ho příkazem kill ukončit:

kill 200

Pokud proces na tento SIGTERM signál nereaguje, použijeme razantnější signál SIGKILL, který proces okamžitě ukončí:

kill -9 200

Závěr

V této lekci jsme se seznámili se správou procesů v Linuxu. Naučili jsme se zobrazovat běžící procesy, pracovat s úlohami v terminálu a ukončovat procesy pomocí příkazů.

V příští lekci, Linuxový terminál (Bash) - Standardní vstup/výstup a expanze, si ukážeme přesměrování standardního vstupu a výstupu, naučíme se používat filtry a roury a vysvětlíme si expanzi.


 

Předchozí článek
Řešené úlohy k 6.-8. lekci základů Linuxu
Všechny články v sekci
Základy Linuxu
Přeskočit článek
(nedoporučujeme)
Linuxový terminál (Bash) - Standardní vstup/výstup a expanze
Článek pro vás napsal Václav Franz
Avatar
Uživatelské hodnocení:
147 hlasů
Aktivity