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