Procesy

Procesy

Spouštění programů

Proces je v UNIXu každý spuštěný program, nahraný do paměti. Každý proces má svoje jednoznačné identifikační číslo PID, vlastníka, prioritu a rodiče.

Spouštění aplikací v Bash

Když zadáme jméno spustitelného souboru v DOSu, ten se dívá, zda toto jméno existuje v aktuálním adresáři. Pokud ano, tak jej spustí. V Linuxu je třeba zadat jméno spustitelného souboru včetně cesty k němu i když máme soubor v aktuálním adresáři!
Stačí použít relativní cestu, tj. ./jmeno_souboru.
Jinak Bash prohledává adresáře uvedené v PATH. Proměnná PATH obsahuje seznam adresářů ve kterých jsou spustitelné soubory (většinou jsou to adresáře bin).

Pokud chceme aby byl program nebo skript spustitelný, je vhodné použít konstrukci:

chmod +x jmeno_souboru

Kdy souboru přidáme právo X, čímž umožníme soubor spouštět (eXecute). V dalším kroku pak program spustíme. Takto se uvádějí v chod především skripty, tento postup lze však použít i pro další programy.

./jmeno_souboru

Process status

PID je unikátním číslem, náležící právě jednomu procesu a které jádro přiděluje vzestupně každému spuštěnému procesu. Číslo 1 má vždy proces init, který je v systému spuštěn jako první. Pro zjišťování PID kteréhokoli z běžících procesů (tedy nejen úloh spuštěných v rámci Bashe) slouží program ps. Když jej spustíme bez přepínačů, uvidíme jen aktuální Bash, seznam spuštěných úloh a vlastní běžící ps.

Ps vypíše informace o běžících procesech. Nevyžaduje znak "-" před zadáváním voleb.
Příkaz ps bez parametrů vypíše pouze procesy uživatele, který tento příkaz spustil a pouze ty procesy, které byly spuštěny ze stejného terminálu jako samotný příkaz ps. Chceme-li vypsat všechny procesy běžící v systému, tak použijeme následující parametry:

Stavy při výpisu procesů pomocí ps:

pstree

Top

Dalším příkazem, který vypisuje aktuálně běžící procesy a spoustu dalších důležitých systémových informací je příkaz top. Tento příkaz na rozdíl od předchozího příkazu ps nevypisuje pouze výpis aktuálního stavu procesů v systému, ale dokáže tento výpis dynamicky po určitých časových intervalech měnit. Díky tomu můžeme v reálném čase sledovat změny stavu procesů, jejich "boj" o procesor, aktuální velikost paměti, které procesy alokují a spoustu dalších užitečných informací. Defaultní časový interval změny výpisu je nastaven na 5 sekund, lze jej však změnit pomocí parametru -d.

Chod programu můžeme ovlivnit klávesami:

Po zjištění viníka našich problémů nemusíme top opouštět. Po stisknutí [K] budeme vyzváni k zadání PID, kterému chceme poslat balíček. Po odentrování správného PID nám bude nabídnuto zadání signálu. Nezadáme-li žádný, bude odeslán SIGTERM (15), což je požadavek k ukončení, jeho násilná varianta, jak už bylo uvedeno je signál s číslem 9.

Spouštění na pozadí

Aby bylo možné co nejlépe využít víceúlohového prostředí (multitaskingu), zavedly interpretry možnost přepnout program spuštěný v textovém prostředí na pozadí. Spustit nebo přepnout program na pozadí znamená, že v průběhu jeho běhu máme k dispozici prompt a můžeme zadávat další příkazy. Spustíme-li prostřednictvím Bashe nějakou aplikaci v grafickém prostředí, neukáže se nám prompt dříve, než tato aplikace skončí.
Řekněme, že jsem z terminálu spustil gkrellm (panel pro monitorování systému), který teď blokuje prompt. Aplikace běží a kurzor v Bashi stojí nebo bliká bez promptu na začátku nového řádku. Takto běžící program můžeme z terminálu zastavit kombinací kláves [Ctrl+z]. Objeví se hláška Stopped. Od tohoto okamžiku sice máme zase prompt, ale program je zamrzlý. Aby mohl ve své činnosti pokračovat, musíme mu povolit činnost na pozadí příkazem bg. Po odentrování se ihned rozběhne.

Existuje ale i způsob, jak spustit grafickou aplikaci na pozadí přímo. Dělá se to přidáním znaku ampersand (&) za příkaz spouštějící aplikaci. Tak např. XMMS spouštíme z příkazové řádky zadáním:

xmms &

Po odentrování dostaneme zpátky prompt a také okno spouštěné aplikace.

Řízení více souběžných procesů

Z výše zmíněného vyplývá, že programů na pozadí můžeme spustit více souběžně. Jak se v nich potom ale vyznat, když jim chceme posílat různé signály? Jednoduše, neboť Bash si tyto úlohy čísluje. Seznam běžících nebo stojících úloh získáme příkazem jobs.
V seznamu je na každém řádku jedna úloha. V hranaté závorce je uvedeno číslo úlohy, následuje status (Running/Stopped) a zakončuje příkaz, kterým jsme úlohu spustili. Velmi důležité je zde číslo úlohy, pomocí něhož můžeme jednotlivé z nich oslovovat. Chceme-li např. vrátit z pozadí do popředí úlohu číslo 2, zadáme:

fg %2

Bash vypíše jméno příslušné úlohy a začne ji provádět na popředí, tj. nevrátí nám prompt. Ten bychom získali postupem [Ctrl+Z] a bg %2.
Nyní se podíváme ještě na pár parametrů příkazu jobs. Přepínače lze samozřejmě kombinovat.

Jak dostat úlohu pod správu Job Control?

1. Spustíme-li úlohu na pozadí (&), vypíše se identifikace:

yes > /dev/null &
[1] 1234

číslo úlohy je 1 a má top-level proces 1234.

2. Běží-li úloha normálně spuštěná na popředí a chceme s ní nějak naložit, stiskneme [CTRL-Z] a shell pošle procesu signál STOP. Vypíše se:

yes > /dev/null
[2]+ Stopped yes > /dev/null
jobs

Vypíše seznam řízených úloh.
’+’ znamená current job, ’-’ znamená previous job.

[1]- Running yes > /dev/null &
[2]+ Stopped yes > /dev/null

3. Spuštění stoplého procesu:

fg %2

4. Zabití zastaveného procesu:

kill %1

Ukončení procesu

Teď si ukážeme, jak ukončit nějakou úlohu na pozadí. Lze to samozřejmě udělat tak, že ji nejprve přepneme do popředí a potom ukončíme klávesovou kombinací [Ctrl+C]. Existuje ale i jiný způsob. Seznamme se s legendárním příkazem kill. Abychom určili adresáta, použijeme číslo úlohy (třeba kill %3) nebo číslo procesu (PID - např. kill 7190), tím pošleme požadavek na ukončení. Pokud program nereaguje vůbec, můžeme jej násilně ukončit signálem 9 takto:

kill -9 %2

Signály

Signál je systémem generovaná událost, kterou používá na základě reakce na podmínku a dává tím procesu šanci provést odezvu. Používají se při chybách v programech. Vyvolává je shell nebo terminal driver nebo si je procesy posílají mezi sebou.

Příznaky ve sloupci "Akce" mají následující význam:

Plánování

At

Aplikace, která se má spouštět plánovaně nesmí mít interaktivní rozhraní. Pokud by totiž program potřeboval komunikovat s uživatelem, ztrácelo by předpřipravené spouštění smysl. K jednorázovému spouštění procesů se používá příkaz at. Nástroj se používá k ukládání příkazů, které mají být provedeny jednorázově později, v předem definovaný čas. Vykonání úlohy má na starosti démon. Jeho spuštění se provede příkazem:

/etc/init.d/atd start

Parametrem příkazu at je plánovaný čas vykonání. Pomocí přepínače -f lze zadat i soubor, který bude v určený okamžik proveden. Pokud soubor neuvedeme, objeví se prompt at>, kam příkazy zadáme. Zadávání ukončíme stiskem [Ctrl+D].
Předpokládejme, že je 16:00, do příkazového řádku zapište:

at 16:45

warning: commands will be executed using /bin/sh
at>

play /usr/share/sounds/KDE_Startup.wav

Po odentrování každého řádku přidáváme další příklady. Zadávání ukončíme již zmíněnou zkratkou [Ctrl+D].
Jako potvrzení úlohy proběhne hláška:

job 1 at Mon Feb 6 16:45:00 2012

Dále se hodí využít flexibilnost příkazu, jako ukazuje následující příklad:

spsei@debian:~$ at now + 2 hours
warning: commands will be executed using /bin/sh
at> shutdown -h now
at> <EOT>
job 2 at Mon Feb 6 18:50:00 2012

Se stavbou at now + ... můžete, kromě hodiny (hour) / (hours), použít i minuty (minutes), dny (days), týdny (weeks) i roky (years).

Pro zobrazení naplánovaných úloh se používá příkaz:

at -l

Níže uvedeným příkazem spolu s číslem úlohy (zjištěné pomocí přepínače -l) úlohu zrušíte

atrm 1

Právo na používání nástroje at lze regulovat:

Crontab

Cron je unixová utilita, která umožňuje automatické spouštění úkolů (scriptů) v pravidelných intervalech. To je velmi užitečné například při zálohování dat, pravidelné údržbě systému nebo kontrole funkčnosti vzdálených zařízení.
Crontab je soubor, který obsahuje soupis příkazů, které jsou spouštěny v určeném čase a to na samostatném řádku. Příklad crontabu může vypadat například takto:

# Delej neco kazdou lichou hodinu kazdy sudy den:
* 1-23/2 */2 * * root /usr/local/sbin/delej_tady_neco.sh
# Zalohovani dat 1 x tydne v noci z patku na sobotu (v 0:42):
42 0 * * 6 root /usr/local/sbin/zal_data_tyden.sh