13.6.2012

Seznámení se základními principy operačního systému UNIX, převážně z uživatelského hlediska. Absolvent kurzu by měl být schopen napsat netriviální program v shellu.
LordG
Matfyz(ák|ačka) level I
Příspěvky: 15
Registrován: 11. 1. 2012 13:08
Typ studia: Informatika Bc.

13.6.2012

Příspěvek od LordG »

Zadání:
Vytvořit skript, který vypíše strom hierarchické závislosti procesů. Závislost = rodič-potomek, identifikátorem je PPID z výpisu ps.

Parametry:
formát výpisu - nepovinný, seznam ps sloupců, které mají být vypsány
podmínky - normálně, co parametr, to podmínka, ve tvaru SLOUPEC=HODNOTA nebo SLOUPEC~REGEXP

Příklad vstupu:
./skript.sh PID=11.*

Příklad ps
PID PPID COMMAND
1 0 init
1 335 bash
1123 335 ps
1124 335 more
502 335 man

Odpovídající výstup (například):
PID PPID COMMAND
+ 1 0 init
+-+ 1 335 bash
| +-+ 335 1124 ps
| +-+ 335 1124 more

Tedy rozbor:
1) načtení parametrů
zkontroluju, jestli první parametr je seznam sloupců pro ps (pozná se tak, že NEobsahuje = ani ~)

zbytek pošlu jako proměnnou do AWK

ps a -o "PPID,PID,$SLOUPCE" | tr -s ' ' | awk (..viz níže..); komentář: v ps potřebuju PPID a PID při zpracování vždy a není jistota, že je tam uživatel zadal. Navíc je třeba ošetřit (což jsem neudělal, a ani bych to nestihnul, že pokud existuje PODMÍNKA na nějaký sloupec, který ale není $SLOUPEC, je nutné si ho do ps přidat)
2) AWK
-- oddělovač sloupců MEZERA
a) zpracování řádek
tři pole:
první obsahuje prostě seznam PID a je indexované 1 .. N. Možná by nebylo třeba, ale aspoň mně to usnadnilo práci

druhé obsahuje řádky ps bez prvních dvou sloupců

třetí obsahuje vazby PID => PPID, tedy klíč je PID, hodnota PPID

navíc vyšetřím podmínky (pří zpracovávání první řádky namapuji název sloupce na číslo) a označím si nějakým prefixem vyhovující řádky

b) vytvoření stromu
pro každý klíč najdu přes třetí pole rodiče, a jedu dokud nějaký rodič je, tedy se od uzlu či listu dostanu ke kořeni

seřadím bubblesortem, abych už měl stromovou strukturu v pořádku

c) označení vhodných položek stromu
pokud nejsou žádné omezující podmínky na hodnoty sloupců, prostě označím vše. Jinak pro každou označenou řádku označím ji i všechny rodiče až po kořen.

d) výpis
pořádně jsem nedodělal.. prostě "nějak" :))

Snad to někomu pomůže, asi tam nemám vše..
Odpovědět

Zpět na „SWI095 Úvod do UNIXu“