Procesy jsou běžící programy. Mohou se nacházet v různých stavech, zde vyjmenuju stavy z pohledu uživatele.
běžící (running, R): proces je aktuálně zpracováván procesorem
spící (sleeping, S): čeká, až na něj přijde řada na procesor, čeká na IO, zkrátka čeká
pozastavený (stopped, T): proces byl pozastaven, například z důvodu debuggování
zombie (zombie, Z): nechtěný stav procesu, proces už měl skončit, ale stále ještě je zaveden
Každý proces je jednoznačně identifikován číslem PID (process identification number). Po bootu systému se rozběhne první proces, který pro většinu systému je /sbin/init a má PID 1. Tento proces se pak stává rodičovským procesem dalších procesů. A tyto procesy se stávají rodiči dalších procesů.
Příklad: na stroji běží proces sshd, tedy ssh deamon, který naslouchá, jestli se někdo nechce připojit k serveru. Přihlašujete-li se, vytvoříte potomka tohoto sshd, který je zrovna pro to vaše připojení a je mu přiřazen nějaký terminál pts/2 třeba. Potomkem tohoto terminálu je bash, jakožto interpret příkazové řádky. Příkazy, které do řádky píšete, jsou potomky bashe.
Rychlou a celostní informaci o procesech zobrazuje příkaz top, který uživateli zobrazí přehled procesů a listuje přes aktuálně běžící nejvíce zatěžující procesy.
Z tohoto zobrazovače je možné se dostat stiskem klávesy q. Nástroj top mimojiné také ukazuje počty procesů a statistiku jejich stavů.
top je nástroj natolik oblíbený, že má spousty mutací, variant a alternativ.
Neinteraktivně: ps
Pro monitorování procesů jsou ještě kromě interaktivních nástrojů velmi využívané nástroje neinteraktivní.
Ty uživateli pouze vypíší výstup podle zadaných parametrů. Jejich výhodou je možnost následného zpracování nebo přesměrování výstupu do logu.
Neinteraktivní prohlížení umožňuje příkaz ps, který vylistuje procesy podle zadaných parametrů (pouze pro aktuálního uživatele ps u, všechny procesy ps aux, pro další použití zkonzultujte manuálové stránky příkazu ps).
V terminálu: jobs
Přehled o procesech v rámci terminálové session vám umožní příkaz jobs. Číslo, které zobrazuje, je Job ID, je pravděpodobně velmi nízké (1, 2, 3), nezaměňujte s PID.
Spouštění do popředí
Do této chvíle jsme spouštěli procesy napsáním příkazu, enter. Takto jsou příkazy spouštěné do popředí, tedy dokud neskončí, není možné napsat další příkaz.
Pokud chci příkazové řádce schválně pustit příkaz do popředí, napíšu za něj (a všechny jeho parametry) znak středníku ;. Když budu chtít, můžu takto napsat několik příkazů za sebou a ty se postupně budou provádět, jakmile skončí jeden, provede se druhý.
date; who; Spustí příkaz date (vypíše datum a čas), po něm spustí příkaz who (vypíše, kdo je aktuálně přihlášený na počítači).
mplayer film.avi; poweroff Pustí film a po jeho skončení vypne počítač.
sleep 2m; echo "prestan luhovat caj" Čeká 2 minuty a pak napíše "prestan luhovat caj".
Spouštění do pozadí
Spuštění do pozadí je princip, ve kterém je proces spuštěný nezávisle na terminálu, ve kterém jej spouštíte a tudíž vám jej nezabírá pro například psaní dalších příkazů. Tento princip byl podstatný v dřevních dobách počítačů, kdy jste měli přístup jen jednomu terminálu, ale i dnes je dobré vědět, které procesy jsou závislé na původním terminálu a co to pro ně znamená, když terminál zavřu, když mi spadne spojení atp. (Ano, proces, který jsem spustila do pozadí, běží i v případě, že zavřu terminál nebo ztratím spojení ssh.)
Pro spuštění do pozadí napíšu za příkaz i se všemi jeho parametry operátor ampersandu &.
firefox & thunderbird & vi muj_oblibeny_soubor.txt Spustí do pozadí firefox a thunderbird a do popředí pouští textový editor.
cp velikansky_soubor /media/flash_disk/ & Spustí do pozadí kopírování, práce v terminálu může pokračovat dle chuti.
Změna stavu procesů z pohledu uživatele
Běžný uživatel pravděpodobně nedojde do situace, kdy by potřeboval změnit stav procesu, s výjimkou násilného ukončení procesu, který přestal reagovat. Poučený uživatel potřebuje alespoň znát alespoň několik příkazů, kterými může měnit stav procesu, případně to, jestli je proces v popředí nebo v pozadí.
Jak změnit stav procesu
Proces běží v popředí. Stiskem ctrl-c posílám signál SIGINT, který jej povětšinou ukončí.
Proces běží v popředí. Stiskem ctrl-z posílám SIGTSTP, který proces pozastaví, bude ve stavu stopped.
Příkaz kill posílá signály. Defaultně posílá signál SIGTERM, který ukončí proces, nicméně je-li proces pozastaven, čeká na nějakou vstupvýstupní operaci nebo je zamrzlý, nemusí reagovat. Pak je potřeba poslat mu signál SIGKILL pomocí parametru kill -9. K příkazu je ještě potřeba dát jako parametr PID, aby kill věděl, co má ukončovat.
Příkaz killall bere jako parametr jméno procesu nebo dokonce jen jeho parametr. To dává příkazu velkou sílu, ale také možnost ukončit více procesů, než jste původně chtěli.
Proces je pozastavený. Příkazem bg Job_ID jej rozběhnu do pozadí (bg jako background). Místo parametru Job_ID je potřeba napsat číslo v rámci terminálu, nějaké malé číslo.
Proces je pozastavený. Příkazem fg Job_ID jej rozběhnu do popředí (fg jako foreground).
Proces je v pozadí. Příkazem fg Job_ID jej rozběhnu do popředí (fg jako foreground).
exit status
Každý příkaz, který spustím, má nějaký exit status, číselnou hodnotu, která naznačuje, jak skončil. Je-li hodnota nulová, příkaz proběhl v pořádku. Nenulová hodnota naznačuje chybu, v dokumentaci příkazu by mělo být k dohledání co která hodnota znamená. Exit status posledního příkazu mohu zjistit pomocí systémové proměnné $?.
jana@drak:~$ echo ahoj
ahoj
jana@drak:~$ echo $?
0
jana@drak:~$ rm neexistujici_adresar
rm: cannot remove 'neexistujici_adresar': No such file or directory
jana@drak:~$ echo $?
1