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
$ ps -u marek --forest -o tty,pid,ppid,pgrp,comm
TT      PID  PPID  PGRP COMMAND
tty2  27603  2941 27603 zsh
tty2  27737 27603 27737  \_ ps
tty1  27562  2940 27562 zsh
tty1  27577 27562 27577  \_ man
tty1  27588 27577 27577      \_ less

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
$ zalohujDATA &

#..... na jiném terminálu
$ ps -u marek --forest -o tty,pid,ppid,pgrp,comm
TT      PID  PPID  PGRP COMMAND
tty2  27603  2941 27603 zsh
tty2  27737 27603 27737  \_ ps
tty1  27562  2940 27562 zsh
tty1  27577 27562 27577  \_ man
tty1  27588 27577 27577      \_ less
?     27941     1 27941 zalohujDATA

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
$ nohup zalohujDATA &
nohup: ignoring input and appending output to 'nohup.out'

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
$ setsid zalohujDATA

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
$ nohup setsid zalohujDATA
  • setsid vytvoří novou session bez řídicího terminálu (SIGHUP nemůže přijít ani pro případné potomky procesu)
  • nohup přesměruje stdout/stderr do nohup.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
$ at ČAS DATUM + PŘÍRŮSTEK
Č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
$ at now + 20 minute
warning: commands will be executed using /bin/sh
at> du -sh ~
at> df -h /home
at> ^D (zadávání ukončím pomocí Ctrl+D)
job 12 at Wed Nov 27 11:33:00 2013

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
# * * * * *  command to execute
# ┬ ┬ ┬ ┬ ┬
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ └───── den v týdnu (0 - 7) (0 i 7 je neděle)
# │ │ │ └────────── měsíc (1 - 12)
# │ │ └─────────────── den v měsíci (1 - 31)
# │ └──────────────────── hodina  (0 - 23)
# └───────────────────────── minuta (0 - 59)

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
$ echo $EDITOR
vim
$ EDITOR=mcedit
$ echo $EDITOR
mcedit
$ crontab -e

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
$ screen

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 N Ctrl+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 či Ctrl+A 1 či Ctrl+A 2 či …
Přepne na okno číslo 0 či 1 či 2 atd.
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 [ či Ctrl+A Ctrl+[ či Ctrl+A ESC
zapne “copy/scrollback” mód. V tomto módu se lze pohybovat pomocí šípek, kláves jhkl, PageUp, PageDown atd. Stiskem mezerníku můžeme označovat text. Označení textu se ukončí opět mezerní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 -r

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/.


Související posty