Skupiny procesů¶
Každý proces je vytvořen jako potomek svého rodiče. Procesy jsou na sobě
závislé a tvoří skupiny. Například program
man běží v shellu a zároveň
používá program less. V následujícím příkladu vidíme
ve sloupci PPID PID rodičovského procesu a ve sloupci PGRP PID vedoucího skupiny.
Jestliže bude z jakéhokoliv důvodu rodičovský proces ukončen, budou s ním ukončeni i všichni jeho potomci.
1 2 3 4 5 6 7 | |
Pokud požadujeme, aby byl proces nezávislý na svém rodiči a aby byl sám vedoucím
skupiny, spustíme ho na pozadí pomocí metaznaku &. Pozor: tímto proces není odpojen od
terminálu a ukončení terminálu může vést (a v závislosti na konkrétním shellu a jeho
nastavení často vede) k ukončení procesu. Tento problém řeší programy nohup a setsid
popsané níže.
1 2 3 4 5 6 7 8 9 10 11 | |
Nyní se může uživatel odhlásit a program zalohujDATA poběží dál.
Session (sezení procesu)¶
Skupiny procesů jsou dále sdruženy do session. Každá session má nejvýše jeden
řídicí terminál. Když uživatel terminál zavře, jádro zašle signál SIGHUP
všem procesům v popředí dané session — a shell ho dál rozešle i procesům na pozadí.
Jinými slovy: samotné & nestačí. Pokud se terminál zavře, procesy na pozadí
SIGHUP dostanou a zpravidla skončí.
nohup¶
Program nohup spustí příkaz s nastavenou ignorací signálu SIGHUP a přesměruje stdout do souboru nohup.out (pokud stdout míří
na terminál):
1 2 | |
Proces zůstává ve stejné session, ale SIGHUP ignoruje a jeho výstup není
svázán s terminálem.
setsid¶
Program setsid spustí příkaz v nové session bez
řídicího terminálu. Protože terminál ani neexistuje, SIGHUP jednoduše nemá
odkud přijít:
1 | |
Proces je plně odpojen od session shellu. Nevýhodou je, že stdout a stderr
stále míří na původní terminál — pokud ten zanikne, zápis do výstupu skončí chybou EIO a proces může spadnout.
nohup setsid¶
Kombinace obou nástrojů pokrývá oba problémy najednou:
1 | |
setsidvytvoří novou session bez řídicího terminálu (SIGHUPnemůže přijít ani pro případné potomky procesu)nohuppřesměruje stdout/stderr donohup.out(žádnéEIO)
Toto je nejrobustnější způsob odpojení procesu od terminálu bez použití terminál multiplexeru.
Atd¶
V operačním systému Unix lze spuštění procesu naplánovat. K jednorázovému naplánování spuštění procesů slouží systémová služba atd. Uživatelský obslužný program se jmenuje at.
Syntaxe programu at může obecně vypadat takto
1 | |
- ČAS lze specifikovat jako
- dvojtečkou oddělené hodiny a minuty ve 24-hodinovém formátu nebo
midnight,noon,teatime(4pm). - DATUM lze specifikovat jako
- den v týdnu zapsaný pomocí anglických zkratek (
Sun,Mon,Tue,Wed,Thu,Fri,Sat) - DEN.MESIC
- DEN.MESIC.ROK
- pokud datum není uvedeno, program kalkuluje s aktuálním datem
- PŘÍRŮSTEK
- se zapisuje jako počet jednotek:
minutes,hours,days,weeks,months,years
| příklad | popis |
|---|---|
at 9:45 26.3.2056 |
26. března 2056 |
at tomorrow + 1 hours |
zítra o hodinu později |
now + 2 weeks |
za dva týdny |
13:10 + 20 minutes |
ve 13:30 |
Například:
1 2 3 4 5 6 | |
V 11:33 se úloha spustí. A vypíše se (du) místo,
které na disku zaujímá můj domovský adresář a (df)
obsazené místo na svazku /home.
V předchozím odstavci bylo použito sloveso vypíše se. Zbývá ale vyřešit problém, kam se vypíše. Uživatel může být přihlášen několikrát, nebo nemusí být přihlášen vůbec. Standardní výstup naplánované úlohy se proto zašle do e-mailové schránky uživatele. Automaticky se předpokládá, že uživatel má na systému lokální e-mailovou schránku nebo že je mu lokální pošta přeposílána.
Crond¶
Systémová služba Cron slouží k opakovanému spouštění procesů vždy ve stanovený čas.
Časy spouštění programů se zapisují do tabulky:
1 2 3 4 5 6 7 8 9 | |
Například:
| zápis | popis |
|---|---|
* * * * * command |
spustí příkaz každou minutu |
15 0 * * 1 command |
spustí příkaz vždy v pondělí 15 minut po půlnoci |
40 8,9,10 * * * command |
spustí příkaz 3x denně: 8:40, 9:40, 10:40 |
40 8-10 * * * command |
spustí příkaz 3x denně: 8:40, 9:40, 10:40 |
*/20 * * * * command |
příkaz se spustí každých 20 minut |
30 15 5,10,15,20,25,30 * * |
každý 5., 10., 15., 20., 25. a 30. den v měsíci vždy v 15:30 |
30 15 5-31/5 * * |
každý 5., 10., 15., 20., 25. a 30. den v měsíci vždy v 15:30 |
Uživateli slouží pro obsluhu program crontab s následujícími parametry
| parametr | popis |
|---|---|
-l |
vypíše tabulku |
-r |
vymaže tabulku |
-e |
edituje tabulku v textovém editoru, uživatel nastavuje editor v proměnné prostředí EDITOR |
1 2 3 4 5 6 | |
Terminál multiplexer¶
Existují speciální programy, které jsou označovány jako terminal multiplexer. Jejich zástupcem může být oblíbený program GNU Screen.
Umožňuje uživatelům přistupovat k několika terminálovým sezením uvnitř jediného okna terminálu či vzdáleného terminálového sezení. To je užitečné pro práci s více programy z příkazové řádky a pro oddělení programů od unixového shellu, který program spustil.
Dá se říci, že se jedná o textovou verzi správce oken nebo o umístění virtuálních terminálů do libovolného přihlášeného sezení. Je to obal, který umožňuje běh několika textových programů zároveň a dovoluje uživateli efektivně používat programy v jediném rozhraní.
Program také umožňuje nechat běžet několik interaktivních programů a přitom nebýt přihlášen. Nebo programy spustit, odhlásit se, potom se opět přihlásit a pokračovat v rozdělané práci.
Program spustíme příkazem
1 | |
Po úvodní obrazovce se spustí uživatelský shell a program screen není na
první pohled vidět. Všechny klávesové zkratky začínají kombinací Ctrl+A a
za ním následuje stisk další klávesy (nebo kombinace).
Ctrl+A ?- Vypíše nápovědu.
Ctrl+A C- Vytvoří nové okno. V každém okně může běžet jiný program
Ctrl+A NCtrl+A P- Cykluje mezi otevřenými okny
Ctrl+A Ctrl+A- Cykluje mezi dvěma naposledy otevřenými okny
Ctrl+A "- Vyvolá (interaktivní) seznam oken
Ctrl+A Shift+A- Přejmenuje aktuální okno
Ctrl+A 0čiCtrl+A 1čiCtrl+A 2či …- Přepne na okno číslo
0či1či2atd. Ctrl+A Shift+S- Rozdělí okno horizontálně na dva regiony.
Ctrl+A |- Rozdělí okno vertikálně na dva regiony.
Ctrl+A X- Zruší aktuální region.
Ctrl+A TAB- Přepne na následující region.
Ctrl+A [čiCtrl+A Ctrl+[čiCtrl+A ESC- zapne “copy/scrollback” mód. V tomto módu se lze pohybovat pomocí šípek, kláves
jhkl,PageUp,PageDownatd. Stiskemmezerníkumůžeme označovat text. Označení textu se ukončí opětmezerníkem. Text je uložen ve schránce. Tento mód lze ukončit i bez mezerníku pomocíESC. Ctrl+A ]- Vloží text ze schránky.
Ctrl+A d- Odpojí okno. Screen stále běží, ale uživatel se od něj odpojil. Nyní se může
uživatel odhlásit; programy spuštěné ve screenu poběží dál. Uživatel se může
například přesunout k jinému počítači. Po opětovném přihlášení (například pomocí
SSH) se může uživatel znovu připojit příkazem
screen -r.
1 | |
Screen není jediným zástupcem svého druhu. Já mám například rád program tmux: http://www.root.cz/clanky/okna-v-terminalu-pomoci-tmux/.