Procesy

Pri samontom štarte počítača resp. servra štartujú niektoré prednastavené programy, z ktorých sa každý stane procesom. Tieto procesy sú riadené samotným jadrom, ktoré rozhoduje o prideľovaní systémových prostriedkov, behu a stave procesu. Každý jeden proces má určenú prioritu, ktorú určuje jadro. V prípade spustenia procesu môžeme aj manuálne stanoviť prioritu procesu ale môžeme ju meniť aj počas behu samotného procesu. Linuxové systémy sú stavané ako multitaskingové. Ak by sme nemali multitasking, systém by sme nevedeli používať reálne. Len ako príklad uvediem, že sú bežiace procesy napr. IO operácie, aktuálny čas, samotný desktop manažér a iné aktuálne bežiace programy. Celý beh je zabezpečený tak, že sa jednotlivé procesy “bijú” o procesorový čas a následne sa vykonávajú postupne. Jednotlivé procesy sú vykonávané postupne s ohľadom na ich prioritu. Procesy môžu byť v niekoľkých stavoch. Na výpis jednotlivých procesov používame príkaz ps.

Označenie stavu procesuPopis
DProcesy v neprerušiteľnom spánku (väčšinou IO opeárcie)
RAktuálne bežiaci proces
SSpiaci proces, čaká na vykonanie
TPozastavený proces
ZZombie proces
<Proces s vysokou prioritou
NProces s nízkou prioritou
LProces uzamknutý v pamäti, real-time proces
lMultithreadový proces
+Proces je v skupine bežiacich na popredí

V prípade zadania príkazu ps bez rožšírení, dostaneme jednoduchý výstup:

jano@srv2 ~ $ ps
PID TTY          TIME CMD
7095 pts/0    00:00:00 bash
7297 pts/0    00:00:00 ps
jano@srv2 ~ $

Príkaz ps v tomto prípade vypisuje bežiace procesy len v aktuálnej konzole /dev/pts/0. V prípade Linuxu môžeme zadať dva najčastejšie zaužívané príkazy pre zistenie všetkých procesov:

jano@srv2 ~ $ ps aux | head
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   1732   376 ?        Ss    2011   0:49 init [3]
root         2  0.0  0.0      0     0 ?        S<    2011   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S<    2011   0:00 [migration/0]
root         4  0.0  0.0      0     0 ?        S<    2011   0:06 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<    2011   0:03 [events/0]
root         6  0.0  0.0      0     0 ?        S<    2011   0:00 [work_on_cpu/0]
root         7  0.0  0.0      0     0 ?        S<    2011   0:00 [khelper]
root        82  0.0  0.0      0     0 ?        S<    2011   0:00 [kintegrityd/0]
root        84  0.0  0.0      0     0 ?        S<    2011   0:33 [kblockd/0]
jano@srv2 ~ $ ps -ef | head
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0  2011 ?        00:00:49 init [3]
root         2     0  0  2011 ?        00:00:00 [kthreadd]
root         3     2  0  2011 ?        00:00:00 [migration/0]
root         4     2  0  2011 ?        00:00:06 [ksoftirqd/0]
root         5     2  0  2011 ?        00:00:03 [events/0]
root         6     2  0  2011 ?        00:00:00 [work_on_cpu/0]
root         7     2  0  2011 ?        00:00:00 [khelper]
root        82     2  0  2011 ?        00:00:00 [kintegrityd/0]
root        84     2  0  2011 ?        00:00:33 [kblockd/0]
jano@srv2 ~ $

V prvom prípade dostávame vo výstupe nasledovné položky:

  1. USER – užívateľ, pod ktorým je proces spustený
  2. PID – číslo procesu
  3. %CPU – vyťaženie procesora
  4. %MEM – vyťaženie RAM
  5. VSZ – veľkosť procesu vo virtuálnej RAM
  6. RSS – resident set size, reálna pamäť
  7. TTY – konzola, v ktorej proces beží
  8. STAT – status procesu, viď tabuľka
  9. START – kedy bol proces spustený
  10. TIME – čas vyhradený procesorom
  11. CMD – príkaz s parametrami

V druhom výpise pribudol PPID, čo je číslo rodičovského procesu. Len výpis aktuálných procesov je nám nanič ak s nimi nemáme ďalší úmysel. V prípade mrznutia niektorého procesu, alebo vyťažovania systému niekorým procesom je vhodné použiť príkaz top, ktorý usporiada procesy práve podľa vyťaženia procesora.

Výpis z príkazu top:

top – 14:15:23 up 120 days,  1:53,  1 user,  load average: 0.06, 0.02, 0.01
Tasks: 244 total,   1 running, 243 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.3%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1001448k total,   176548k used,   824900k free,     1240k buffers
Swap:  1044184k total,     9088k used,  1035096k free,    27396k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
7517 jano     20   0  2396 1176  840 R  0.7  0.1   0:00.03 top
1 root      20   0  1732  376  332 S  0.0  0.0   0:49.77 init
2 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kthreadd
3 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 migration/0
4 root      15  -5     0    0    0 S  0.0  0.0   0:06.25 ksoftirqd/0
5 root      15  -5     0    0    0 S  0.0  0.0   0:03.69 events/0
6 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 work_on_cpu/0
7 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 khelper
82 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kintegrityd/0
84 root      15  -5     0    0    0 S  0.0  0.0   0:33.45 kblockd/0

Osobne mám radšej program htop, ktorý okrem toho, že je farebný, je interaktívny a nahrádza aj niektoré externé príkazy.

Výstup z príkazu htop:
  CPU[||                        2.6%]     Tasks: 301 total, 1 running
  Mem[|||||||              139/977MB]     Load average: 0.20 0.05 0.01
  Swp[|                    14/1019MB]     Uptime: 120 days(!), 08:28:40

  PID USER     PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
 9594  jano     20   0  4672  1364  1060 R  2.0  0.1  0:00.13 htop
    1 root      20   0  1732   376   332 S  0.0  0.0  1:08.91 init [3]
  562 root      16  -4  2276   312   264 S  0.0  0.0  0:00.04 /sbin/udevd -d
 1460 root      20   0  1744   336   324 S  0.0  0.0  0:00.00 /usr/sbin/acpid
 1575 root      20   0  4404   732   388 S  0.0  0.1  2:02.06 crond
 1641 messageb  20   0  2372   656   476 S  0.0  0.1  0:00.48 dbus-daemon –syst
 1679 haldaemo  20   0 15300  1508   760 S  0.0  0.2  1:03.95 hald
 1795 haldaemo  20   0 15300  1508   760 S  0.0  0.2  0:00.00 hald
 1681 root      20   0 19788  1576   752 S  0.0  0.2  0:00.19 /usr/sbin/console-
 1698 root      20   0 19788  1576   752 S  0.0  0.2  0:00.00 /usr/sbin/console-
 1704 root      20   0 19788  1576   752 S  0.0  0.2  0:00.00 /usr/sbin/console-
 1705 root      20   0 19788  1576   752 S  0.0  0.2  0:00.00 /usr/sbin/console-
 1707 root      20   0 19788  1576   752 S  0.0  0.2  0:00.00 /usr/sbin/console-
 1709 root      20   0 19788  1576   752 S  0.0  0.2  0:00.00 /usr/sbin/console-
 1710 root      20   0 19788  1576   752 S  0.0  0.2  0:00.00 /usr/sbin/console-
 1713 root      20   0 19788  1576   752 S  0.0  0.2  0:00.00 /usr/sbin/console-
 1714 root      20   0 19788  1576   752 S  0.0  0.2  0:00.00 /usr/sbin/console-
F1Help  F2Setup F3SearchF4InvertF5Tree  F6SortByF7Nice -F8Nice +F9Kill  F10Quit

Vyťaženie procesora a RAM sa zobrazuje graficky aj číselne, jednotlive procesy sa radia podľa vyťaženia CPU ale klávesou F6 môžeme toto zoradenie meniť podla jednotlivých dostupných možností. Okrem toho je možné meniť prioritu procesov, radiť do stromovej štruktúry alebo aj poslať signál príkazom kill cez funkčné tlačítko F9. Prednastavená je hodnota 15, teda signál TERM.  Ukončenie príkazu htop je rovnako ako príkazu top a to stlačením q. Ovládať jednotlivé procesy môžeme aj príkazom kill z príkazového riadku. Typov signálov je viac v závislosti od operačného systému. V prípade Linuxových distribúcií budú zrejme rovnaké, ale v prípade iných Unixových systémov sa môžu poradia líšiť. Preto odporúčam overiť si čísla signálov príkazom:

jano@srv2 ~ $ kill -l
 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    
jano@srv2 ~ $

Z vyššie uvedeného dôvodu neodporúčam sa ich učiť naspamäť, pokiaľ nie ste programátorom a budete ich využívať len občas. Niektoré najčastejšie využívané signály uvádzam v tabuľke:

SignálPopis, použitie
HUPPre znovunačítanie konfigurácie bez vypnutia
INTUkončenie príkazu, napr. CTRL+C
KILLNásilné ukončenie bez možnosti uloženia
TERMUkončenie procesu štandardným spôsobom
CONTZnovuspustenie stopnutého procesu, príkazy fg a bg
STOPPozastavenie bežiaceho procesu, CTRL+Z

Jednotlivé signály zadávame príkazom kill v dvoch formách:

  1. kill -[číslo signálu] PID
  2. kill -[názov signálu] PID

V prvom prípade posielame napríklad signál KILL nasledovne:

jano@srv2 ~ $ kill -9 1834

V druhom prípade vytvoríme názov odobraním časti SIG z daného signálu:

jano@srv2 ~ $ kill -KILL 1834

Túto možnosť by sme mali zvážiť v prípade, že sme na inom systéme ako Linux, pretože by číslo mohlo znamenať iný typ ako sme chceli pôvodne zadať. Zatiaľ som ale nestretol systém, kde by signál KILL mal iné číslo ako 9. V prípade signálov STOP a CONT môžete očakávať jednoznačné rozdiely na rôznych Unixových systémoch. Tieto signály sa môžu využiť v reálnom prostredí veľmi výhodne. Napríklad náš server je vyťažený procesom, ktorý ale nemôžeme ukončiť no bráni nám vo vykonaní nejakej závažnej úlohy. Napríklad prebieha synchronizácia dát cez rsync alebo scp. V tomto prípade môžeme danému procesu zaslať signál STOP a po vykonaní našej operácie zašleme danému procesu signál CONT. Pozastavená úloha sa následne spustí na pozadí a pokračuje vo vykonávaní.

Zaujímavým programom v Linuxe je killall. Mnoho Linuxákov ho využíva, pretože sa ním dajú jednoduchšie riadiť procesy. V prípade príkazu kill je nutné poznať jeho PID a zaslať vybraný signál tomuto číslu. V prípade killall je možné zaslať signál zadaním názvu procesu.V mojom prípade ukončím proces s názvom sleep.

jano@srv2 ~ $ killall -9 sleep

V prípade komerčných Unixov ale tento príkaz vykoná ukončenie všetkých bežiacich procesov bezohľadu na názov zadaný ako argument. Dávnejšie bola presadená jeho iná varianta zo systému Solaris od SUN/Oracle a to príkaz pgrep a pkill. Príkaz pgrep nám vypíše všetky PID, ktoré obsahujú zadaný názov ako argument. Príkazom pkill priamo tieto procesy ovplivníme zadaným typom signálu.

jano@srv2 ~ $ pgrep sleep
1255
4387

jano@srv2 ~ $ pkill -9 sleep

Príkaz pkill a pgrep má viac možností rozšírenia a preto odporúčam prejsť si jeho manuálovú stránku, určite objavíte aj iné užitočné prvky.

WordPress SEO fine-tune by Meta SEO Pack from Poradnik Webmastera