Procesy v Linuxe

Aby používateľ operačný systém (OS) Linux mohol spravovať a vykonávať na nǒm rôzne operácie, musí mať právo spúšťať programy (viac v návode Správa súborov a používateľov v linuxovom príkazovom riadku).

Spustené programy sa v Linuxe nazývajú procesy. Každý proces má okrem názvu (napr. systemd) aj svoj jednoznačný identifikátor (process ID resp. PID) vyjadrený číslicou (systemd má PID 1). Každý proces (okrem procesu číslo 1) bol spustený iným procesom. Proces, ktorý spustil iný proces (dieťa resp. child), sa nazýva rodičovský proces a je označený pomocou jednoznačného rodičovského identifikátora (parent process ID resp. PPID) vyjadreného číslicou (napr. 2). PID a PPID jednotlivých procesov je možné vypísať pomocou programu ps (ako Process Status) napríklad takto:

ps xafo user,pid,ppid,stat,pri,ni,%cpu,%mem,cmd

Program ps dokáže o procesoch podať viac informácií, ale pre potreby tohto návodu sme si zvolili iba meno používateľa (user), PID, PPID, stav procesu (stat), prioritu určenú jadrom (pri), prioritu určenú používateľom (ni ako niceness),  využitie procesora (%cpu), využitie pamäte RAM (%mem) a príkaz spusteného programu (cmd) spolu s označením vzťahu rodič – dieťa.

Delenie procesov

Procesy v Linuxe sa delia na dve veľké skupiny:

  1. automatické procesy – tieto automaticky spúšťa operačný systém (nie používateľ) a bežia takpovediac na pozadí (background processes), pričom neočakávajú vstup od používateľa (sú neinteraktívne). Môže ísť o služby (daemons), ktoré Linux potrebuje pre zabezpečenie základnej funkčnosti (napr. sshd alebo crond).
  2. interaktívne procesy – tieto spúšťa používateľ a bežia takpovediac v popredí (foreground processes). Očakávajú vstup od používateľa. Túto skupinu procesov je možné nastaviť tak, aby bežali v popredí, ale tiež na pozadí. Môže ísť o spustené programy ako napr. ps alebo top.

Stavy procesov

Spustený program (proces) môže nadobudnúť tieto stavy:

  1. Spustený (Running alebo R) – proces je už spustený, alebo čaká na pridelenie niektorému z jadier procesora (CPU)
  2. Čakajúci (Waiting) – proces čaká na udalosť alebo na systémové prostriedky. Tento stav sa delí na:
    1. prerušiteľný (interruptible alebo S) – je možné ho ukončiť
    2. neprerušiteľný (uninterruptible alebo D) – nie je možné ho ukončiť
  3. Zastavený (Stopped alebo T) – nižšie v tomto návode si popíšeme, ako spustený proces ukončiť.
  4. Zombík (Defunct alebo Z) – procesy, ktoré sú ukončené (rodič), ale stále sú v zozname procesov, pretože čakajú na ukončenie iných procesov (dieťa).

Spustenie procesov

Aby sme si ukázali, ako spúšťame programy a ako následnej pracujeme s procesmi, vyberieme si program sleep. Tento program zabezpečí, že sa v linuxovom príkazovom riadku bude čakať 1000 sekúnd a až potom sa môže pokračovať:

sleep 1000

Ak sa nám nechce čakať 1000 sekúnd, môžeme program ukončiť klávesovou skratkou Ctrl + C alebo program zastavíme pomocou klávesovej skratky Ctrl + Z. V zozname úloh zistíme, že existuje jeden proces, ktorý je zastavený (stopped):

jobs

Zastavenú úlohu (job) sleep 1000 však môžem opäť spustiť tak, že ju pomocou programu fg (ako foreground) prenesiem do popredia (prvý riadok). Následne ju opäť pomocou klávesovej skratky Ctrl + Z zastavíme (Stopped), a potom pomocou programu bg (ako background) prenesiem do pozadia (druhý riadok), kde sa odpočívanie v tichosti dokončí (Running alebo S) a program sleep 1000 sa tak ukončí.

fg %1
bg %1

Po spustení programu bg %1 (číslo za percentom podľa zoznamu úloh z jobs) sa k programu sleep 1000 na koniec pridal znak &, a tak sme dostali program s parametrami sleep 1000 &. Znak & na konci ľubovoľného príkazu znamená, že chceme program spustiť na pozadí a mať tak možnosť ďalej pracovať v príkazovom riadku. Ak teda potrebujeme program spustiť na pozadí, priamo zadáme príkaz takto:

sleep 1000 &

Spustenie procesu môžeme teda oddialiť, ak pred ním spustíme proces sleep s požadovaným počtom sekúnd. Ak ale proces potrebujeme spustiť v presne stanovený deň a čas, máme tieto dve možnosti:

  1. at (z anglického o) – ak potrebujeme spustiť program v budúcnosti iba raz.
  2. cron (ako Command Run ON) – ak potrebujeme program v budúcnosti spúšťať pravidelne.

AT

Povedzme, že dnes na obed o 12:00 (v 24-hodinovom formáte) potrebujeme zapísať obsah domovského priečinka do textového súboru. Keďže ale o takomto čase budeme na obede a nie pri počítači, necháme túto prácu na počítač:

at 12:00

Stlačíme kláves Enter a zadáme príkaz:

ls -lah ~/ > ~/obsah_domovskeho_priecinka.txt

Po zadaní príkazu stlačíme kláves enter a následne klávesovú skratku Ctrl + D, čím dokončíme príkaz, ktorý sa má spustiť v budúcnosti.

Pre istotu skontrolujeme, či je úloha naplánovaná na správny čas (prvý riadok) so správnym príkazom (druhý riadok):

at -l
at -c n

Znak n zameníme za poradové číslo úlohy, ktoré sme zistili zo zoznamu plánovaných úloh (at -l).

Ak by sme sa pomýlili, môžeme úlohu vymazať takto:

at -r n

Znak n zameníme za poradové číslo úlohy, ktoré sme zistili zo zoznamu plánovaných úloh (at -l).

Poobede už len skontrolujeme, či súbor existuje a či obsah zodpovedá tomu, čo sme očakávali.

CRON

Ak vyššie spomínanú úlohu potrebujeme vykonať každý deň o 12:00, je jednoduchšie použiť cron. Najskôr si overíme, či pre prihláseného používateľa existuje tabuľka úloh naplánovaná v programe cron:

crontab -l

Ak neexistuje a vypíše sa “no crontab for username” (pričom username bude nahradené konkrétnym menom), tabuľku vytvoríme:

crontab -e

Stlačíme kláves enter, otvorí sa súbor v textovom editore nano a na koniec otvoreného súboru zadáme na nový riadok:

0 12 * * * ls -lah ~/ > ~/obsah_domovskeho_priecinka.txt

Súbor uložíme pomocou klávesovej skratky Ctrl + X a následne stlačením klávesa y a potvrdením klávesom enter.

Prvý údaj (0) znamená minúty, druhý (12) reprezentuje hodiny, tretí obsahuje deň v mesiaci (1 - 31), štvrtý označuje mesiac (1 - 12) a piaty deň v týždni (0 - 6). Na mieste tretieho, štvrtého a piateho údaja je v tomto prípade hviezdička, ktorá zastupuje všetky možné hodnoty. Na konci sa uvádza príkaz, ktorý sa má vykonať.

Veľmi dobrá pomôcka na zápis úlohy do tabuľky programu cron je online nástroj crontab.guru.

Overíme, či sa úloha zapísala:

crontab -l

Ak je na konci zapísaná, odteraz sa každý deň o 12:00 zapíše obsah domovského priečinka do súboru obsah_domovskeho_priecinka.txt.

Rovnako, ako sme úlohu zapísali (crontab -e), môžeme úlohu aj zmeniť alebo vymazať.

Priorita procesov

Aby Linux spusteným procesom mohol bezpečne prideľovať procesorový čas, musí najskôr poznať prioritu spustených procesov. Čím vyššia priorita, tým skôr proces získa procesorový čas a tým skôr sa vykoná. Niekedy potrebujeme, aby bol proces vykonaný čo najskôr (proces je veľmi dôležitý), inokedy na dokončenie procesu tolerujeme aj dlhší čas (proces je menej dôležitý).

Používateľ síce procesom určuje prioritu (nice), ale jadro (kernel) Linuxu si prioritu procesov môže upraviť podľa toho, ako je aktuálne systém vyťažený. Môže sa stať, že pre systém kriticky dôležitý proces vyťažuje procesor na maximum. Vtedy akýkoľvek proces spustený používateľom bude mať prioritu zníženú natoľko, aby nezaberal procesorový čas dôležitejším systémovým procesom.

Priorita, ktorú určuje jadro, je vyjadrená číslom v rozmedzí 0 – 139. Priorita, ktorú určuje používateľ (nice), môže mať hodnotu medzi -20 a +19. Hodnota -20 znamená, že používateľ procesu priraďuje najvyššiu prioritu. Platí vzorec: priorita určená jadrom = priorita určená používateľom + 20

Keby sme teda chceli, aby proces, ktorý chceme spustiť, mohol využívať čo najviac percent procesora, spustili by sme ho takto:

sudo nice -n -19 sleep 1000

Najvyššiu prioritu procesu priraďujeme až po dôkladnom zvážení možných následkov.

Od 0 do +19 (kladné hodnoty) nice nastavujeme bez práva roota (napr. nice -n 10 sleep 1000), no všetko pod nulou (záporné hodnoty) je potrebné spustiť ako root (napr. sudo nice -n -19 sleep 1000).

Je tiež možné zmeniť nice už spustenému procesu. Najskôr si musíme zistiť PID spusteného procesu (prvý riadok), následne nice zmeníme (druhý riadok).

ps -C sleep
sudo renice -n -10 -p n

Znak n (na konci druhého riadku) zameníme za PID, ktoré sme zistili zo zoznamu spustených procesov pomocou programu ps -C sleep.

Ukončenie procesov

Proces sa v Linuxe môže ukončiť sám po vykonaní, alebo ho ukončíme ručne. Manuálne ukončenie procesu môže byť nevyhnutné, ak proces neodpovedá (nereaguje na vstup používateľa) alebo ak využíva príliš veľa systémových prostriedkov (CPU alebo RAM).

Či proces dlhodobo využíva neprimerane veľa systémových prostriedkov a zabraňuje tak stabilnému fungovaniu celého OS, zistíme pomocou programu top:

top

Program top, podobne ako program ps, vypíše zoznam procesov, ale zároveň zoznam pravidelne aktualizuje, takže máme neustály prehľad. Procesy sú zoradené podľa toho, ako vyťažujú procesor (stĺpec %CPU). Ak zadáme veľké M (Shift + m), prvé budú procesy, ktoré spotrebúvajú najviac pamäte RAM (stĺpec %MEM). Späť k zobrazeniu vyťaženia procesora sa dostaneme pomocou veľkého P (Shift + p).

Proces, ktorý podľa programu top príliš dlho neodpovedá alebo neakceptovateľne zaťažuje OS, je potrebné ukončiť ručne. Interaktívny proces práve spustený používateľom v popredí je možné ukončiť manuálne stlačením klávesovej skratky Ctrl + C. Na pozadí bežiace procesy už však musíme ukončiť pomocou programu kill.

Ručné ukončenie procesu realizujeme až po dôkladnom zvážení možných následkov.

Zo zoznamu programu top získame PID procesu, ktorý neodpovedá, alebo príliš zaťažuje OS a pokúsime sa ho ukončiť pomocou programu kill. Pomocou tohto programu posielame procesom rôzne signály, na základe ktorých sa následne vykoná konkrétna požiadavka. Základné použitie je:

kill n

Znak n zameníme za PID, ktoré sme zistili zo zoznamu spustených procesov pomocou programu top.

Takto pošleme procesu signál číslo 15 (SIGTERM), ktorým žiadame o mäkké ukončenie procesu. To znamená, že procesu dávame čas na to, aby dal vedieť všetkým súvisiacim procesom (vzťah rodič – dieťa), že sa o chvíľu ukončí, a tiež riadne ukončí prácu so súbormi. 

Keby proces o svojom ukončení nedal vedieť ostatným súvisiacim procesom, mohlo by sa stať, že po ňom ostanú procesy, ktoré spúšťal a tie by potom nemuseli fungovať správne. Ideo o procesy-siroty (orphans), keď bol ukončený rodičovský proces, no proces-dieťa (sirota) je stále spustený bez rodiča.

Aby sme predišli nežiadúcim procesom-sirotám, je dobré použiť program killall. Tento program ukončí celú rodinu procesov podľa názvu procesu (stĺpec COMMAND v programe top), nie podľa PID. Čiže ak by sme povedzme trikrát spustili program sleep 1000 & a chceli by sme ukončiť všetky tri inštancie, zariadime to príkazom

Program killall alebo pkill ukončí všetky inštancie programu (tu program sleep). Ručné ukončenie procesu pomocou programu killall alebo pkill tak realizujeme až po dôkladnom zvážení možných následkov.

killall sleep

Program pkill ukončí všetky procesy, ktoré začínajú na “sleep”:

pkill sleep

Môže sa stať, že sa proces ani po zaslaní prednastaveného signálu (15 – SIGTERM) cez programy kill, killall alebo pkill neukončí. Vtedy posielame signál číslo 9 (SIGKILL), ktorým žiadame o tvrdé ukončenie procesu. Takto proces ukončíme bez toho, aby dal vedieť všetkým súvisiacim procesom (vzťah rodič – dieťa), že sa o chvíľu ukončí, a tiež bez toho, aby riadne ukončil prácu so súbormi. Takto môžu vzniknút vyššie spomínané procesy-siroty.

Tvrdé ukončenie procesu realizujeme až po dôkladnom zvážení možných následkov.

Nefungoval teda príkaz na mäkké ukončenie kill n, killall sleep alebo pkill sleep? Fungovať bude signál na tvrdé ukončenie:

kill -9 n
killall -9 sleep
pkill -9 sleep

Znak n zameníme za PID, ktoré sme zistili zo zoznamu spustených procesov pomocou programu top.

Ak potrebujeme ukončiť proces iného používateľa, musíme použiť program sudo:

sudo kill n
sudo killall sleep
sudo pkill sleep

Aj pri ukončovaní procesu iného používateľa najskôr posielame signál číslo 15 (SIGTERM) na mäkké ukončenie procesu. Až v nevyhnutných prípadoch posielame signál číslo 9 (SIGKILL) na tvrdé ukončenie procesu.

Zhrnutie

Definovali sme si pojem proces v Linuxe, jeho druhy a stavy. Na konkrétnych príkladoch sme si ilustrovali, ako procesy spustiť, ako im nastaviť prioritu a ako ich ukončiť. Keďže ide o tému, ktorou je možné v praxi významne ovplyvniť celý chod OS Linux, je potrebné zamýšľané zmeny realizovať vždy až po dôkladnom zvážení možných následkov.

Aktualizované 26. apríla 2021

Bol pre vás tento návod nápomocný?

Mohlo by vás tiež zaujímať:

Spýtajte sa nás, radi poradíme
Po - Ne 8:00-22:00
Kontaktovať podporu