9. diel - Linuxový terminál (Bash) - Práca s procesmi
V dnešnej lekcii sa zoznámime s pojmami proces, úloha či úloha. Následne sa pozrieme na usporiadanie procesov v Linuxe av neposlednom rade sa naučíme pracovať s príkazmi na ich obsluhu.
Procesy v Linuxe
Linux je rovnako ako Windows viacúlohový operačný systém. Jednotlivé aplikácie bežia ako procesy, o ktoré sa procesor strieda alebo ktoré bežia na rôznych jadrách. V procesoch bežia v skutočnosti ešte vlákna, ale tými sa zaoberať nebudeme. Poďme sa na úvod zoznámiť s pojmami úlohu, úloha a proces.Úloha
Úloha čiže task je jednotka vykonávanej práce, ktorá je podčasťou úlohy. Kombináciou niekoľkých úloh potom vzniká jedna úloha.Úloha
Úloha čiže job je kompletná jednotka práce, ktorá sa aktuálne vykonáva. Úlohu tvorí vždy séria jednotlivých úloh.Proces
Proces je synonymom pre bežiaci program. V Linuxe sa stáva procesom každý program, ktorému po spustení pridelí systém pamäť a ďalšie systémové prostriedky. Na jednom jadre procesora môže bežať v daný okamih iba jeden proces, ostatní čakajú, kým na ne príde rad. O pridelení priestoru v procesore rozhoduje jadro operačného systému. Každý proces teda prechádza nasledujúcimi stavmi:- Nový (New) - Proces je práve vytváraný. Zatiaľ nie je pripravený na beh, ale už sú pripravené niektoré časti.
- Pripravený (Ready) - Proces čaká na pridelenie procesora.
- Bežiaci (Running) - Inštrukcie procesu sú práve vykonávané procesorom.
- Čakajúci (Waiting/Blocked) - Proces čaká na udalosť.
- Ukončený (Terminated) - Proces ukončil svoju činnosť, avšak stále ešte vlastní niektoré systémové prostriedky.
Rodičovský proces
Rodičovský proces je označenie pre proces, ktorý vytvoril jedného alebo viacerých potomkov. Rodičia a potomkovia v systéme vytvárajú stromovú štruktúru. Potomok môže od rodiča dediť napríklad obsah pamäte či spracovávané súbory a naopak po svojom ukončení odovzdáva návratový kód rodičovi.Poďme si rodičovský proces ukázať na konkrétnom príklade. Do
terminálu napíšeme príkaz ps -l
, ktorý nám vypíše zoznam
procesov aktuálneho shellu spoločne s doplňujúcimi informáciami:
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
Vo výpise sa zameriame najmä na stĺpce PID
(Process ID) a
PPID
(Parent Process ID). Môžeme si všimnúť, že program
bash
má rovnaké PID
ako program ps
svoje PPID
. Je to z dôvodu, že programom bash
sme
spustili ps
. Proces bash
je teda rodičovský proces
pre ps
, ktorý je naopak potomok tohto procesu.
Príkazom pstree
zobrazíme celú stromovú
štruktúru všetkých procesov v operačnom systéme.
Systemd
Ak je každý proces potomkom iného procesu, potom existuje jeden, ktorý stojí za vznikom všetkých ostatných. Týmto procesom jesystemd
, v starších verziách Linuxu označovaný ako
init
. Po štarte vytvorí jadro systému vlákno s
PID 0
, ktoré následne spustí proces initramfs
. V
starších verziách Linuxu je proces initrd
. Po jeho ukončení sa
spustí systemd
s PID 1
, ktorý následne spustí
zvyšné systémové procesy.
Po zadaní príkazu pstree
si môžeme všimnúť,
že proces systemd
je na vrchole celej stromovej štruktúry.
Daemon
Daemon je proces , ktorý beží bez dozoru, je nezávislý od rodičovského procesu a na pozadí sa stará o chod operačného systému. Daemoni zaisťujú napríklad sieťové služby, tlačové služby a podobne. Spravidla ich spoznáme tak, že názov procesu končí nad
. Medzi najznámejšie deamony patrí
systemd
, crond
spúšťajúci naplánované úlohy,
sshd
zaisťujúce šifrované prihlásenie či ftpd
umožňujúce prenos súborov.
Správa procesov v Linuxe
Teraz sa naučíme používať niekoľko základných príkazov na správu procesov. S ich využitím budeme schopní zobraziť zoznam bežiacich procesov, spustiť nový proces, preniesť proces do popredia či daný proces ukončiť.ps
Príkaz ps
slúži na vypísanie všetkých bežiacich procesov
užívateľa. Vypíšu sa však iba procesy spustené aktuálnym shellom.
Pokiaľ k príkazu pridáme ešte atribút aux
:
ps aux
Získame výpis všetkých aktuálne spustených procesov spoločne s podrobnejšími informáciami:
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
Vidíme tu bežiaci terminál, v našom prípade bash
, a
samotný ps
.
Všimnime si, že každý proces má svoje PID
,
pomocou ktorého ho môžeme napríklad ukončiť. ID je nutné z dôvodu, že
jedna aplikácia môže bežať niekoľkokrát a systém by teda len podľa jej
názvu nerozpoznal ktorý proces má ukončiť.
pstree
Pre prehľadnejší výpis použijeme pstree
, ktorý vypíše
procesy v stromovej štruktúre:
init─┬─init───bash───pstree
├─sshd
└─2*[{init}]
jobs
Okrem ps
môžeme na výpis procesov využiť aj shell builtin
jobs
. Pretože je súčasťou shellu, použijeme ho v prípade,
keď nás zaujímajú procesy, ktoré sme cez shell spustili:
jobs
Po spustení nevidíme žiadne procesy, pretože nemáme žiadne spustené.
Napravíme to a spustíme si napríklad gedit
. Akonáhle vyskočí
okno a my sa vrátime späť do terminálu, zistíme, že je
zaneprázdnený:
admin@itnetwork:~# gedit
█
Proces pozastavíme stlačením klávesovej skratky CTRL + Z:
admin@itnetwork:~# gedit ^Z [1]+ Stopped gedit
bg
Pomocou príkazu bg
spustíme pozastavený proces na pozadí:
admin@itnetwork:~# bg [1]+ gedit &
Vidíme, že teraz reaguje gedit
a zároveň je prístupný aj
terminál.
Proces môžeme na pozadí spustiť ihneď, a to tak, že mu
dáme ako parameter ampersand (&
).
fg
Pomocou príkazu fg
prenesieme proces do popredia. Za príkaz
môžeme zadať PID
procesu po percente alebo ho spustiť bez
parametrov, kedy prenesie do popredia posledný pozastavený proces alebo
posledný proces v pozadí:
admin@itnetwork:~# fg %1
gedit
█
top
Príkaz top
slúži na sledovanie procesov v reálnom
čase a umožňuje efektívnejšie radenie procesov podľa konkrétnych
požiadaviek. Napríklad môžeme procesy zoradiť podľa aktuálneho využitia
CPU, pamäte či ďalších parametrov:
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 hlavičke si môžeme všimnúť informácie o celkovom počte spustených procesov, celkovom využití pamäte a podobne. Poďme sa ešte pozrieť na význam jednotlivých stĺpcov vo výpise:
PID | Identifikačné číslo procesu. |
USER | Užívateľ, pod ktorým je proces spustený. |
PR | Priorita plánovania úlohy. Hodnota rt znamená, že úloha
beží s prioritou plánovania v reálnom čase. |
NI | Priorita procesu alebo tzv. "nice value". Kladná hodnota symbolizuje nízku prioritu, záporná hodnota potom vysokú prioritu. |
VIRT | Celkové množstvo virtuálnej pamäte využitej procesorom. |
RES | Celkové množstvo skutočnej pamäte využitej procesorom. |
SHR | Celkové množstvo zdieľanej pamäte využitej procesorom. |
S | Aktuálny stav procesu. |
%CPU | Percentuálne využitie procesora jednotlivých procesov. |
%MEM | Percentuálne využitie operačnej pamäte jednotlivých procesov. |
TIME+ | Čas v stotinách sekundy, ktorý bol jadrom procesu pridelený. |
COMMAND | Názov spusteného procesu. |
sshd
môžeme použiť filter:
top | grep sshd
kill
Posledný príkaz, ktorý si v súvislosti s procesmi spomenieme, je príkaz
kill
. Ako asi tušíte, slúži na zastavenie či ukončenie
daného procesu. Príkazom kill
môžeme vyslať celkom 62
rôznych signálov. Všetky signály vypíšeme pridaním prepínača
-l
:
kill -l
Výpis príkazu vyzerá nasledovne:
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ály je možné v Linuxe špecifikovať pridaním:
- čísla signálu (
kill -15 PID
), - názvu s predponou (
kill SIGTERM PID
), - alebo názvu bez predpony (
kill -term PID
).
Predvolený signál je SIGTERM
(signal terminate), ktorý sa
snaží proces ukončiť. Ak príkazom top
zistíme, že napríklad
proces s PID 200
nadmerne vyťažuje procesor
počítača alebo zamrzol, napíšeme do terminálu:
kill 200
Pokiaľ SIGTERM
nedokáže proces ukončiť, môžeme využiť
razantnejší signál SIGKILL
:
kill -9 200
V prípade, že tento proces mal PPID 100
, jeho
potomkovia automaticky zmenia svoje PPID
z 200
na
100
.
To je pre dnešnú lekciu všetko 🙂