Cvičení 2

Spouštění procesů na pozadí. Změna priority procesu. Zasílání signálů. Plánované spouštění procesů. Hledání spustitelných souborů. Přesměrování. Roura. Expanse neúplných jmen souborů. Proměnné. Export proměnných. Vytváření skriptů. Základní řídící struktury. Předávání argumentů. Přizpůsobení nastavení shellu.


1.  Správa procesů, signály

Úvodní část cvičení se zabývá spouštěním procesů na pozadí, změnou jejich priority. Procvičováno je používání programů kill(1), nice(1) a  renice(1).

Proces na pozadí spustíme tak, že na konec příkazu přidáme znak ampersand;

 $ cp -r /mnt/cdrom/photo/* /tmp/nowakj/ &
 [2] 3861
 $ 

Seznam procesů na pozadí zjistíme příkazem jobs(1).

 $ jobs
 [1]   Running                 rxvt -sb -fg pink &
 [2]   Running                 Eterm &
 [3]-  Running                 emacs practice2.xml &
 [4]+  Stopped                 gkrellm &
 $ 

Přesunutí procesu na pozadí se provede příkazem bg(1).

 $ bg 4
 [4]+ gkrellm &
 $ 

Pozastavený proces nebo proces běžící na pozadí můžeme přenést na popředí příkazem fg(1).

 $ fg 4
 gkrellm

Příkazem nice(1) se nastaví priorita nově spuštěného procesu. Čím je hodnota nice vyšší, tím je proces „hodnější“ (nice) k ostatním a běží pouze když je volný procesor. Obyčejný uživatel může měnit hodnotu nice pouze svých procesů a to pouze směrem nahoru (základní úroveň je 0).

 $ nice -n 15 cp /mnt/cdrom/* /tmp/cd/

Priorita již běžícího procesu se mění programem renice(1). První číslo je nová priorita, druhé je PID procesu.

 $ renice 14 3333
 3333: old priority 10, new priority 14

Signály se mohou zasílat příkazem kill(1). Seznam povolených signálů je v signal(7).

 $ kill -SIGKILL 3333

Ve většině interaktivních (obvykle konzolových programů) způsobí stisk Ctrl+Z zaslání signálu SIGSTOP, čehož můžete využít k zastavení procesu a přechodu do shellu.

 $ ed
 a
 Ed je standardní unixový editor
 .
 w test

 32
 ^Z

 [5]+  Stopped                 ed
 $ 

Úkol 1. Spusťte program top(1) a zastavte jej. Přesuňte jej na pozadí. Spusťte ještě několik programů. Nakonec je všechny ukončete zasláním vhodných signálů.

2.  Přesměrování, roury

K přesměrování standardního vstupu/výstupu slouží znaky < a >. Například takto podivně by se mohlo provádět kopírování souborů

 $ cat < soubor > kopie

Roury (pipes) slouží k předávání výstupu jednoho programu na vstup jiného. Následující příklad bude číst ze standardního vstupu data, poté je setřídí a nakonec odfiltruje duplicitní řádky.

 $ cat | sort -n | uniq
 jedna
 dva
 tri
 dva
 ^D
 dva
 jedna
 tri

Úkol 2. S využitím probraných filtrů setřiďte různými způsoby výstup programu last(1).

3.  Spouštění příkazů v určitou dobu

 $ at now + 3 hours
 warning: commands will be executed using /bin/sh
 at> /sbin/reboot
 at> ^D
 job 1 at 2001-08-29 23:19
 $ 

Seznam všech vašich úloh zjistíte příkazem atq(1), atrm(1) slouží k jejich odstranění.

 $ atq
 1       2001-08-29 23:19 a novakj
 $ atrm 1
 $ 

4.  Hledání spustitelných souborů

Vyzkoušejte vyhledávat spustitelné soubory v systému pomocí příkazů locate(1), which(1) a whereis(1).

5.  Proměnné

Tato sekce je pozvolným úvodem k vytváření shellových skriptů. Probírají se zde proměnné a jejich použití.

Přiřazení do proměnné se provede následujícím příkazem (mezi rovnítkem a oběma stranami přiřazení nesmí být mezera):

 $ POZDRAV="Dobry den"

Obsah proměnné můžeme vypsat příkazem echo(1). (Při dotazování na obsah proměnné musíme použít před jménem znak dolar).

 $ echo Obsah promenne \$POZDRAV je $POZDRAV
 Obsah promenne $POZDRAV je Dobry den

Proměnné lze použít například pro uchování dlouhé cesty k souboru, abychom ji nemuseli stále vypisovat.

 $ SOUBOR=/usr/share/emacs/20.7/etc/sex.6
 $ cp $SOUBOR /mnt/zip/
 $ man $SOUBOR
 ...

Úkol 3. Prohlédněte si obsah systémových proměnných $MAIL, $HOME, $USER. Vytvořte si nějakou vlastní proměnnou a kreativně ji použijte v nějakém ze známých příkazů.

6.  Programování v (bash) shellu

Nyní si studenti podle přednášek vyzkouší napsat několik krátkých shellových skriptů. Je doporučeno využívat proměnných a použité příkazy efektivně spojovat do rour. Procvičovány jsou základní řídící konstrukce.

Zde je velmi pěkný úvod i s ukázkami funkčního kódu.

V následujícím příkladu přidáme všem souborům (v adresáři /tmp) končícím na „txt“ příponu „.backup“.

 $ for i in /tmp/*txt; do mv $i $i.backup; done

Následuje jednoduchý příklad na větvení programu pomocí konstrukce if-else.

 $ if [ `whoami` = "root" ]
 >  then echo "Jsem buh"
 >  else echo "Tak zas nekdy priste"
 > fi

 Tak zas nekdy priste
 $ 

Úkol 4. Napište jednoduchý skript, kterým zkopírujete soubor /usr/share/common-licenses/BSD na ~/BSD.old, ale pouze pokud je nastavená proměnná $BACKUP.

7.  Přizpůsobení shellu

V této části si studenti za pomoci právě vyzkoušených příkazů nastaví vzhled svého shellu. Více informací je v bash(1)

Pro perzistentní uložení nastavení slouží soubory ~/.bash_profile a ~/.bashrc. Proměnné PS1PS4 slouží k  nastavení různých promptů, hlavní je PS1.

První ukázka nastaví prompt, aby zobrazoval aktuální adresář.

 $ PS1='\w\$ '
 ~$

Druhá donutí prompt, aby zobrazoval jmého počítače a za dvojtečkou jméno uživatele.

 $ PS1='\h:\u \$ '
 alpha:novakj $

Třetí v promptu zobrazuje aktuální datum, čas a pracovní adresář.

 $ PS1='\d, \t \w> '
 Fri Aug 31, 17:14:17 /tmp>

Poslední ukázka nadefinuje funkci vypisující počet procesů běžících na pozadí a poté nadefinuje zelený prompt, ve kterém se mj. zobrazuje počet procesů spuštěných z tohoto shellu.

 $ function jobcount {
 >    JOBS=`jobs | wc -l | awk {'print $1'}`
 >    [ $JOBS != 0 ] && echo -n "$JOBS:"
 > }

 $ PS1='\[\e[22m\e[40m\e[32m\]\h:`jobcount`\w\$\[\e[22m\e[40m\e[37m\] '
 phoenix:3:/var/tmp$

Úkol 5. Zkuste si nastavit různé druhy promptů. Pokud budete s některým tvarem promptu spokojeni, můžete si jeho konfiguraci zapsat do skriptů spouštějících se po vašem přihlášení do systémy.