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).
Pozastavený proces nebo proces běžící na pozadí můžeme přenést
na popředí příkazem fg(1).
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).
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ů
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):
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é PS1 až PS4 slouží
k nastavení různých promptů, hlavní je PS1.
První ukázka nastaví prompt, aby zobrazoval aktuální adresář.
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.