IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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 je systemd, 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čí na d. 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.
Sledovanie procesov ukončíme klávesom q. Ak chceme zobraziť iba jeden konkrétny proces, napríklad 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 🙂


 

Predchádzajúci článok
Linuxový terminál (Bash) - Práca so súbormi
Všetky články v sekcii
Základy Linuxu
Preskočiť článok
(neodporúčame)
Linuxový terminál (Bash) - Štandardný vstup / výstup a expanzia
Článok pre vás napísal Václav Franz
Avatar
Užívateľské hodnotenie:
4 hlasov
Aktivity