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.


