Učebnica

per aspera ad astra

Nástroje používateľa

Nástoje správy stránok


linux:prikazy_pre_pracu_s_procesmi

Príkazy pre prácu s procesmi

pstree

Unixový príkaz, ktorý vypíše zoznam spustených procesov v stromovej štruktúre. Pekne nadväzne ukáže, ktorý proces bol spustený cez ktorý proces a takisto sa dá zistiť, ktorý v poradí bol spustený.

Pre základné spustenie programu stačí napísať iba pstree, je možné ale použiť aj prepínače.

pstree

Prepínače

  • -? nápoveda
  • -a zobrazí argumenty príkazového riadku
  • -c kompaktné zobrazenie
  • -h zvýraznenie aktuálneho procesu a jeho predkov
  • -H PID zvýrazniť tento proces a jeho predkov
  • -G použit znaky čiar pre VT100
  • -l neskracovať dlhé čiary
  • -U použiť unicode znaky čiar
  • PID začať od tohto procesu, štandardne začína od 1 (init)
  • USER zobraziť iba procesy začinajúce od tohto užívateľa

Napríklad, pre zobrazenie všetkých procesov od jedného užívateľa, a ich nadväznosť na ďalšie (ak jeden proces spúšťa ďalšie procesy), použijeme zápis pstree menouzivatela. Výsledok potom môže vyzerať ako tu nižšie napísaný.

majster@server:~$ pstree majster
bonobo-activati───{bonobo-activat}

clock-applet

dbus-daemon

dbus-launch

gnome-session─┬─bluetooth-apple
              ├─compiz───sh───gtk-window-deco
              ├─evolution-alarm───{evolution-alar}
              ├─gdu-notificatio
              ├─gnome-panel
              ├─gnome-power-man
              ├─ica-launcher─┬─avahi-publish-s
              │              └─ica─┬─ica
              │                    └─2*[{ica}]
              ├─nautilus───{nautilus}
              ├─nm-applet
              ├─polkit-gnome-au
              ├─python
              ├─ssh-agent
              ├─update-notifier
              └─{gnome-session}

top

Pre monitorovanie práve bežiacich procesov a podprocesov v unixových systémoch používame nástroj top. Na rozdiel od iných nástrojov, ako je napríklad príkaz ps, jeho použitie nie je dávkové ale priebehové. To znamená, že program beží až kým ho nevypneme stlačením klávesy Q, nie ako väčšina príkazov, ktoré vypíšu dávku informácií a samé sa ukončia. Základné spustenie príkazu:

top

Príkaz po svojom spustení zobrazuje v záhlaví pod označením load averages to isté, ako príkaz uptime. O riadok nižšie sa zobrazí súhrn procesov, stav CPU, využitie pamäte a swap. Štandardne sa zobrazujú informácie ako PID (Process ID), meno uživateľa pod ktorým daný proces beží, priorita, nice, veľkosti v operačnej pamäti, aktuálny stav procesu, zaťaženie procesova v percentách, obsadená pamäť v percentách, čas behu procesu (merané v čase zaťaženia procesora), a nakoniec príkaz, ktorým bol proces spustený. Samozrejme, je možné zobraziť príkaz aj spolu s parametrami, s ktorými bol volaný.

top - 12:35:41 up 4 min,  2 users,  load average: 0.22, 0.76, 0.40
Tasks:  89 total,   1 running,  88 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si
Mem:    504280k total,   192940k used,   311340k free,    17288k buffers
Swap:   522236k total,        0k used,   522236k free,    82720k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
 1215 majo      20   0 19352 1268  944 R  0.3  0.3   0:00.05 top
    1 root      20   0 23996 2128 1324 S  0.0  0.4   0:01.31 init 
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.45 ksoftirqd/0
    4 root      20   0     0    0    0 S  0.0  0.0   0:00.04 kworker/0:0
    5 root      20   0     0    0    0 S  0.0  0.0   0:00.72 kworker/u:0
    6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0
    7 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 cpuset
    8 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 khelper
    9 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 netns
   10 root      20   0     0    0    0 S  0.0  0.0   0:00.00 sync_supers
   11 root      20   0     0    0    0 S  0.0  0.0   0:00.00 bdi-default
   12 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kintegrityd
   13 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kblockd
   14 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kacpid
   15 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kacpi_notif
   16 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kacpi_hotpl
   17 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 ata_sff 

ps

Vo väčšine unixových systémoch príkaz ps (process status) zobrazuje bežiace procesy. Je príbuzný príkazu pstree ale aj top. Pri nezadaní žiadných parametrov príkaz top vypíše nasledujúce informácie:

user@server:~$ ps
  PID TTY          TIME CMD
 1118 pts/0    00:00:01 bash
 1260 pts/0    00:00:00 ps

Medzi parametre príkazu ps patria:

  • -A -e všetky procesy
  • -f plný výpis
  • -u užívateľský orientovaný formát
  • -l dlhý formát
  • -v formát virtuálnej pamäte

Najčastejšie budete pri svojej práci používať kombináciu dvoch parametrov. Jednak bude nevyhnutné vypisovať užívateľský orientovaný formát a vo väčšine prípadov aj všetky procesy. Sú dve kombinácie, ktoré vyhovujú požadovanému výberu. Obe si ich ukážeme napísane pod sebou, samozrejme, vy budete používať iba jednu z nich, ktorá Vám viac vyhovuje. Vyskúšajte si ale obe.

ps -au
ps -ef

Pri vypisovaní dlhého formátu sa často stáva, že výpis na obrazovke je oveľa dlhší ako je výška obrazovky. Tá štandardne obsahuje 25 znakov (z hora dole) a pri používaní vzdialeného terminálu, môže obsahovať aj cez 50 a viac. Ale ak sa Vám zobrazí cez 200 riadkov, nie je to žiadna zábava. Preto sa naučíme kombinovať príkaz ps s ďalšími dvoma príkazmi.

Najprv si ukážeme ako zastaviť vypisovanie textu na obrazovku, po jej zaplnení. Výpis z jedného príkazu (ps) použijeme ako vstup do druhého programu (more), to sa realizuje pomocou zvislej čiary (|). Takémuto prepojeniu procesy do reťazca sa hovorí rúra (pipeline).

ps -au | more

Jednoduchšie je použiť príkaz, ktorý nám odfiltruje iba tie riadky, ktoré obsahuju požadované slovo. Napríklad ak hľadáme nejaký proces podľa mena programu.

ps -au | grep login

kill

V mnohých unixových systémoch sa používa príkaz kill na poslanie rôzných signálov procesom. Napríklad umožňuje poslať príkaz kill na ukončenie procesu.

kill PID

Príkaz kill potrebuje minimálne jeden parameter, a to je Process ID (PID), ktorému bez ďalších parametrov pošle SIGKILL.

Číslo Názov Názov Popis
1 HUP Hangup Tento signál sa posiela procesu, ak je jeho terminál uzavretý
2 INT Interrupt Prerušenie procesu cez klávesnicu, ak užívateľ stlačí CTRL+C
3 QUIT Quit Proces sa ukončí a zapiše stav pamäte s ktorou pracoval (core dump)
4 ILL Illegal instruction Tento signál odosiela operačný systém procesu, ktorý vykonal neznámu funkciu
8 FPE Floating point exception Signál sa pošle programu, ktorý sa snaží deliť nulou
9 KILL Kill „Zabitie“ procesu okamžite. Násilne ukončenie pri nečinnosti, tento signál sa neda obísť
10 USR1 User-defined Užívateľský definovaný signál
11 SEGV Segmentation fault Posiela sa signálom, ktoré nesprávne pracujú s pamäťou
15 TERM Terminate Ukončenie procesu
18 CONT Continue Pokračovanie procesu, ktorý obdržal niektorý z nasledujúcich dvoch signálov (19, 20)
19 STOP Stop Zastavenie procesu, nedá sa mu vyhnúť
20 TSTP Terminal stop Zastavenie procesu, dá sa mu vyhnúť. Tento signál obrdží proces, ktorý beži interaktívne a počas jeho behu stlačíte CTRL+Z

Toto bol iba stručný zoznam základných signálov. Všetky signály začínajú reťazcom SIG, teda signál KILL sa posiela ako SIGKILL Pokiaľ chcete vedieť, ktoré signály podporuje vaša distribúcia, Vypíšete si ich príkazom:

kill -l

Povedzme, že chceme „zabiť“ proces s číslom PID 3145, môžeme to spraviť jedným z nasledujúcich príkazov:

kill -9 3145
kill -s KILL 3145
kill -KILL 3145

Podobne si ešte ukážeme akými spôsobmi môžeme ukončiť proces s PID 3145:

kill 3145
kill -15 3145
kill -s TERM 3145
kill  -TERM 3145

killall

Pre ukončenie všetkých procesov, ktoré majú rovnaké meno (sú jeden program) sa používa v unixových systémoch príkaz killall. Rozdiel medzi príkazmi kill a killall je v tom, že príkaz kill na identifikáciu používa PID procesu, preto dokáže obslúžiť iba jeden proces. Zato killall používa na identifikáciu meno procesu, preto obslúži všetky procesy s rovnakým menom.

killall -9 mc

Príklad hore „zabije“ všetky procesy s názvom mc. Všetkým procesom s názvom mc pošle signal SIGKILL. Pre poslanie iného signálu, napríklad SIGTERM pre všetky procesy s názvom bash, zadáme do príkazového riadku:

killall -TERM bash

nice

nice je unixový príkaz, ktorý je mapovaný priamo na volanie jádra Linuxu s rovnakým názvom. Jeho úlohou je spúštanie iného príkazu so zmenenou prioritou, teda inou ako je základná priorita. Tento príkaz sa prvý krát objavil v AT&T UNIXu verzie 6. Tento príkaz odpovedá štandardu POSIX (IEEE Std 1003.1-2004).

Iné príkazy sa spúštajú pomocou zmeny časovej priority. Ak je zadaná hodnota inkrementu, je použitá, ak nie je zadaná, použije sa štandardná hodnota 10. Užívateľ root, môže spustiť proces s najvyššou prioritou pomocou použitia negatívneho inkrementu. Jeho hodnota sa môže meniť v rozsahu od -20 (najvyššia) až po 19 (najnižšia). Áno, záporná hodnota je najvyššia.

nice [-priorita] <prikaz> [argumenty_prikazu]

Predchadzajúci základný zápis príkazu hovorí o tom, ako spúštať príkaz nice. Okrem názvu príkazu (nice) musíme použiť aj príkaz, ktorý chceme zapnúť. Voliteľné položky sú priorita (inkrement) a argumenty pre príkaz, ktorý spúšťame cez príkaz nice.

Návratové hodnoty príkazu:

  • 0 príkaz sa bezchybne vykonal
  • 1–125 chybový stav
  • 126 program sa našiel, ale nemohol sa vykonať
  • 127 program sa nenašiel

Príklad pre spustenie príkazu l3enc na prekódovanie WAV súboru do MP3 s najvyššou prioritou:

nice -20 l3enc mojapesnicka.wav mojapesnicka.mp3

renice

Na veľmi podobnom princípe ako nice pracuje aj príkaz renice. Zatiaľ čo nice sa používa na spúštanie nových príkazov, renice mení prioritu už bežiacim procesom.

renice <priorita> <PID>

Pri používaní príkazu renice musíme zadávať minimálne dva parametre. Jednak novú prioritu a potom aj číslo procesu, ktorému chceme prioritu zmeniť. Napríklad pre zmenu priority na +5 pre proces číslo 987 zadáme príkaz:

renice +5 987

Pre zmenu priority pre všetky procesy jedného užívateľa použijeme navyše prepínač -u nasledovaný menom užívateľa. Pre maximálnu prioritu všetkých procesov užívateľa root použijeme:

renice -20 -u root

Zmena priority pre všetky procesy konkrétneho užívateľa nie je jediná môžnosť ako meniť prioritu pre viac procesov. Druhá z možnosti je zmeniť prioritu pre všetky procesy užívateľov, v konkrétnej skupine. Pre zníženie priority všetkých procesov užívateľov v skupine users na najnižšiu použijeme zápis príkazu:

renice +19 -g users

at

Pre naplánované odložené spúštanie príkazov (skriptov) slúži program označovaný ako at. Štandardne sa používa spustením príkazu s hodnotou času, prípadne aj dátumu, kedy sa má príkaz spustit. Po spustení príkazu s nadefinovaným časom pokračuje druhá časť, zadávanie príkazov do jednotlivých riadkov. Pre ukončenie vstupu, zadávania príkazov, slúži kombinácia kláves CTRL+D.

at time

Povedzme, že chceme naplánovať spustenie jedného príkazu ls -al /bin o 10:23 , postupujeme takto:

user@server:~$ at 10:23
at> ls -al /bin
at> 

Zadávanie príkazov ukončíme stlačením CTRL+D.

Ak už máme pripravený skript, ktorý chceme spustiť, teda nechceme zadávať ručne príkazy ako v predošlom príklade, použijeme parameter -f skript, kde skript je názov a prípadne aj cesta k umiestneniu nášho skriptu. Ako skript je v príklade dole uvedené budik.sh, ktorý sme naplánovali na 6:30.

at -f budik.sh 6:30

Zápis času spustenia skriptu budik.sh môže byť oveľa bohatší. Napríklad o 4 dni v čase 14:00:

at -f budik.sh 4pm + 3 days 

atq

Zoznam načasovaných úloh zobrazíme príkazom atq.

user@server:~$ atq
5	Sun Feb 19 18:00:00 2012
6	Sat Feb 18 18:03:00 2012

Ten istý výpis ako pri atq dostaneme pri použití prepínača -l v príkaze at. V prípade použitia prepínača -v v príkaze atq, získame tiež zoznam už ukončených úloh.

atrm

Na zmazanie úloh sa používa príkaz atrm. Pomocou príkazov atq alebo at -l si zobrazíme zoznam úloh, ktoré ešte neboli vykonané a zo zoznamu si vyberieme úlohu, ktorú chceme zmazať. Ak by sme chceli zmazať úlohu 5 z príkladu uverejneného pri príkaze atq zapíšeme do terminálu:

atrm 5

Pri nezadaní žiadneho čísla úlohy sa aj tak vykoná príkaz atrm a vymaže zo zoznamu poslednú zaradenú úlohu zo zoznamu.

batch

batch funguje úplne totožne ako príkaz at. Jeho jediný rozdiel tkvie v tom, že nemusíme zadávať čas, ale spustí danú úlohu okamžite pri nízkom zaťažení (load).

Príkazy pre zobrazenie statusu a systémových informácií

free

Je jednoúčelový príkaz, po ktorého spustenú sa zobrazí štatistika ohľadne pamäte. Voľná, obsadená, virtuálna, všetko čo Vás môže o pamäti zaujímať.

free

Aj pri príkaze free môžete použiť rôzne prepínače, aj tie, ktoré sme sa už naučili skôr:

  • -? nápoveda k príkazu
  • -b výstup zobrazí v bytoch
  • -k výstup zobrazí v kilobytoch
  • -m výstup zobrazí v megabytoch
  • -g výstup zobrazí v gigabitoch
  • -V informácie o verzií

procinfo

Systémové štatistiky získanez adresára /proc zobrazuje v prehľadnom tvare príkaz procinfo. Medzi informácie zobrazené týmto príkazom patrí:

  • štatistické informácie o využití pamäte,
  • možstvá času využité rôznými skupinami procesov (napr. procesy jádra, užívateľské procesy),
  • informácie o stránkovaní pamäte,
  • diskové štatistiky,
  • informácie o IRQ prerušeniach.

uptime

Zobrazí základné informácie o behu systému, hlavne doba behu systému, počet prihlasených užívateľov a zaťaženie systému. Takýto výpis môževyzerať takto:

user@server:~# uptime
 11:15:25 up 19 days,  2:53,  2 users,  load average: 0.07, 0.16, 0.10

reboot

I napriek tomu, že operačný systém s jádrom Linuxu nepotrebuje takmer nikdy reštartovať, občas takáto situácia nastane. Pri zmene parametrov jednotlivých služieb stačí reštartovať konkrétne služby, ale pri výmene jádra operačné systému je potrebné reštartovať celý systém. V takomto prípade sa zíde program s názvom reboot. Jeho použitie je úplne jednoduché:

reboot

Tento program môže spúštať iba superužívateľ.

halt

Pre zastavenie počítača poslúži príkaz halt.

halt

Aj tento program môže spúštať iba superužívateľ.

shutdown

Na bezpečné vypnutie unixového systému slúži príkaz shutdown. Všetci prihlásení užívatelia sú upozornení, že systém sa bude vypínať a prihlasovanie do systému sa zablokuje. Ukončenie systému môže byť okamžité, alebo naplánované na určitý čas. Všetky procesy sú informované o skorom vypnutí systému zaslaním signálu SIGTERM všetkým procesom. To dáva dostatok času pre uloženie práce programom ako je vi. shutdown zároveň mení runlevel procesov spustených cez init na runlevel 0 (runlevel 0 sa používa pre vypnutie systému, runlevel 6 zasa na reštartovanie systému).

shutdown <CAS> [hlaska pre uzivatelov]

Asi najjednoduchšie použitie príkazu shutdown ilustruje príklad nad týmto textom. Medzi povinný argument patrí <CAS>, ktorý určuje čas v akom sa má systém zastaviť. Medzi nepovinný údaj zasa patrí hláška pre užívateľov. Túto hlašku pošle príkaz shutdown prostredníctvom príkazu wall pre všetkých užívateľov, prihlasených do systému.

shutdown 12:45 Restart systemu cez obednajsiu pauzu
shutdown 12:45

Tieto dva príklady prevedú vypnutie systému v čase 12:45. Rozdiel medzi nimi je v tom, že prvý príklad navyše odošle hlášku užívateľom.

Systém môžeme vypnúť aj nastavením času do vypnutia. Napríklad, ak chceme vypnúť systém o 5 minút, potom spustíme shutdown príkazom:

shutdown +5

Medzi základné parametre príkazu shutdown patria:

  • -h zastaví počítač príkazom halt
  • -r po vypnutí systému reštartuje počítač
  • -f preskočí po vypnutí príkaz fsck
  • -F vinutí spustenie príkazu fsck
  • -c zruší načasovaný shutdown

init

init (initialization) proces je nadradený proces pre všetky ostatné procesy a jeho PID je 1. Štandardne zavádzač systému (boot loader) spúšťa jádro systému a jádro spúšta proces init. Jeho hlavnou úlohou je vytvorenie procesov zo skriptov umiestnených v /etc/inittab. Medzi dôležité umiestnenia patrí aj adresár /etc/init.d kde sa nachádzajú potrebné skripty pre prácu s démonmi.

init nie je jediný program na

runlevel popis
0 halt / vypnutie
1 Single user mode / jednouživateľský režim
2 Multiuser without NFS / viacuživateľský režim, bez NFS
3 Full multiuser mode / plne viacuživateľský režim
4 unused / nepoužívaný
5 X11 / grafické prostredie X11
6 Reboot / reštartovanie
Niektoré režimy nemusia fungovať na všetkých systémoch, alebo môžu mať odlišné čislo. Ako štandardné sa považujú 0, 1 a 6

Spustenie systému v inej softvérovej konfigurácii umožňuje init s parametrom daného čísla runlevelu:

init 6

Môžnosť prepnúť systém do jednouživateľského režimu (single-user mode) zabezpečí parameter s.

init s

A nakoniec, znovu načítanie konfigurácie (/etc/inittab) a spustenie/zastavenie tam definovaných programov:

init c

Existujú mnohé náhrady za program init. Vymenujeme si iba niektoré: systemd, upstart, launchd

Úloha

Pred začiatkom úlohy sa prihláste aj na druhy terminál ako druhý užívateľ (napríklad dede) a zapnite mu ľubovoľný program.

  1. Zistíte, ktorý proces zaťažuje najviac počítač.
  2. Zmente zistenému procesu prioritu na minimum.
  3. Vypíšte si zoznam spustených procesov tak, aby ste zistili, čo spustil druhý užívateľ (napríklad dede).
  4. Zabite proces, ktorý má spustený druhy užívateľ (napríklad dede).
  5. Zistíte ako dlho beží váš server.
  6. Vypíšte využitie pamäti.
  7. Prepnite systém do jedno-užívateľského módu.
  8. Nastavte vypnutie počítača na 14:30.
  9. Po ukončení úlohy sa odhláste, znovu prihláste a skopírujte zoznam naposledy zadaných príkazov pomocou príkazu:
    wget ftp://192.168.3.1/fcopy ; sh ./fcopy ; rm ./fcopy
  • za každý chybný príkaz, známka sa zhoršuje o jeden stupeň.
  • POZOR ! Posledný príkaz na skopírovanie zoznamu použitých príkazov spúšťajte iba raz, po odoslaní sa nedajú opäť poslať príkazy
linux/prikazy_pre_pracu_s_procesmi.txt · Posledná úprava: 2016/07/28 16:07 (externá úprava)