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 procesu Popis
D Procesy v neprerušiteľnom spánku (väčšinou IO opeárcie)
R Aktuálne bežiaci proces
S Spiaci proces, čaká na vykonanie
T Pozastavený proces
Z Zombie proces
< Proces s vysokou prioritou
N Proces s nízkou prioritou
L Proces uzamknutý v pamäti, real-time proces
l Multithreadový 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:
- USER – užívateľ, pod ktorým je proces spustený
- PID – číslo procesu
- %CPU – vyťaženie procesora
- %MEM – vyťaženie RAM
- VSZ – veľkosť procesu vo virtuálnej RAM
- RSS – resident set size, reálna pamäť
- TTY – konzola, v ktorej proces beží
- STAT – status procesu, viď tabuľka
- START – kedy bol proces spustený
- TIME – čas vyhradený procesorom
- 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+843) 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ál Popis, použitie
HUP Pre znovunačítanie konfigurácie bez vypnutia
INT Ukončenie príkazu, napr. CTRL+C
KILL Násilné ukončenie bez možnosti uloženia
TERM Ukončenie procesu štandardným spôsobom
CONT Znovuspustenie stopnutého procesu, príkazy fg a bg
STOP Pozastavenie bežiaceho procesu, CTRL+Z
Jednotlivé signály zadávame príkazom kill v dvoch formách:
- kill -[číslo signálu] PID
- 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.