pokretanje izvršnog fajla -...

98
Pokretanje izvršnog fajla Eksterne komande koje smo do sada prešli na predavanjima su tipično bile smeštene u /bin ili /sbin direktorijumu Aktivirali smo komande jednostavnim kucanjem naziva komande, a koji je odgovarao nazivu izvršnog fajla te komande Šta se dešava ako bi izvršni fajl komande pomerili u neki drugi direktorijum? Zavisi od sadržaja promenljive $PATH. direktorijum? Zavisi od sadržaja promenljive $PATH. Ako $PATH sadrži dotični direktorijum onda bi komanda bila izvršena, a ako ne sadrži onda komanda ne bi bila izvršena. Takođe, ako postoji više izvršnih fajlova istog naziva, onda se izvršava onaj iz direktorijuma koji je najranije naveden u $PATH promenljivoj. Ako se želi izvršiti izvršni fajl istog naziva iz nekog drugog direktorijuma onda se mora kucati kompletna (apsolutna ili relativna) putanja tog izvršnog fajla.

Upload: others

Post on 18-Sep-2019

2 views

Category:

Documents


0 download

TRANSCRIPT

Pokretanje izvršnog fajla

• Eksterne komande koje smo do sada prešli na predavanjima su tipično bile smeštene u /bin ili /sbin direktorijumu

• Aktivirali smo komande jednostavnim kucanjem naziva komande, a koji je odgovarao nazivu izvršnog fajla te komande

• Šta se dešava ako bi izvršni fajl komande pomerili u neki drugi direktorijum? Zavisi od sadržaja promenljive $PATH.direktorijum? Zavisi od sadržaja promenljive $PATH.

• Ako $PATH sadrži dotični direktorijum onda bi komanda bila izvršena, a ako ne sadrži onda komanda ne bi bila izvršena.

• Takođe, ako postoji više izvršnih fajlova istog naziva, onda se izvršava onaj iz direktorijuma koji je najranije naveden u $PATH promenljivoj. Ako se želi izvršiti izvršni fajl istog naziva iz nekog drugog direktorijuma onda se mora kucati kompletna (apsolutna ili relativna) putanja tog izvršnog fajla.

Pokretanje izvršnog fajla

• U suštini ako /bin ne bi bio naveden u $PATH onda se komande ne bi mogle izvršavati onako kako smo do sada radili.

• Ako se izvršni fajl nalazi u direktorijumu koji nije u $PATH putanji onda se on pokreće kucanjem kompletne apsolutne putanje izvršnog fajla ili kompletne relativne putanje (pri putanje izvršnog fajla ili kompletne relativne putanje (pri čemu se mora navesti i trenutni direktorijum).

• Na primer, ako se izvršni fajl PRIMER nalazi u tekućem direktorijumu koji nije u $PATH, onda bi se on pokrenuo sa ./PRIMER

Primer

U ovom primeru je pokrenuta jedna igrica prostim kucanjem naziva izvršnog fajla jer se direktorijum u kom se nalazi izvršni fajl nalazi u $PATH. Na slici se može videti deo prozora otvorene igrice.

Primer

U ovom primeru je izvršni fajl kopiran u home direktorijum korisnika ubuntu. Naziv kopije je promenjen da se ne bi aktivirao izvršni fajl iz games direktorijuma. Home direktorijum korisnika ubuntu nije deo $PATH što se može videti sa prethodnog slajda. Sada se izvršni fajl nije pokrenuo uspešno, ali se kucanjem relativne putanje uspešno pokrenuo. Uspešno pokretanje je moglo da se uradi i sa: /home/ubuntu/mines tj. kucanjem apsolutne putanje. Ako bi se nalazili u /home direktorijumu tada bi pokretanje relativnom putanjom bilo ubuntu/mines

Podešavanja dozvola

Da bi fajl mogao da se izvrši neophodno je da ima aktiviranu dozvolu za izvršavanje (x iz tripleta rwx). U datom primeru se vidi da ako se skine x dozvola, fajl ne može da se pokrene tj. izvrši.

Dodavanje direktorijuma u $PATH

• Ako se želi dodati direktorijum u $PATH onda se može uraditi ažuriranje vrednosti $PATH promenljive: PATH=$PATH:direktorijum gde se za direktorijum stavi apsolutna putanja željenog direktorijuma

• Navedena promena je privremena tj. kad se korisnik izloguje promena će biti izgubljena (postupak naveden u izloguje promena će biti izgubljena (postupak naveden u prethodnoj stavci se stoga mora ponoviti pri svakom novom logovanju)

• Ako se želi trajna promena onda je neophodno željeni direktorijum uneti u odgovarajući konfiguracioni fajl

• Na primer, /etc/environment ako se želi promena vidljiva na nivou celog sistema, odnosno odgovarajući konfiguracioni fajl iz home direktorijuma ako se želi da promena bude vidljiva na nivou korisnika

Primer

U datom primeru je dodat home direktorijum korisnika ubuntu u $PATH promenljivu. Sada je dovoljno kucati samo mines da bi se fajl pokrenuo tj. izvršio. Napomena: na primer, ako bi u /home/ubuntu postojao poddirektorijum test i ako u njega premestimo mines, više ne bi bilo dovoljno kucati mines već bi se trebalo kucati test/mines (ako se nalazimo u /home/ubuntu) tj. gleda se samo sadržaj direktorijuma iz $PATH promenljive, ali ne i poddirektorijumi tih direktorijuma.

Primer

U .bashrc fajl je dodata linija PATH=$PATH:$HOME;Promena nije odmah vidljiva jer se .bashrc pokreće pri otvaranju terminala.Promena nije odmah vidljiva jer se .bashrc pokreće pri otvaranju terminala.

Nakon ponovnog pokretanja terminala, vidljiva je promena u $PATH promenljivoj. Izmena u .bashrc je zgodna za situaciju kada se uvek pokreće terminal iz grafičkog okruženja, a ako to nije slučaj onda je potencijalno zgodnije neki drugi konfiguracioni fajl da se edituje (tipično je u pitanju fajl .profile ili fajl sličnog naziva, ali uvek je potrebno proveriti i nazive samih konfiguracionih fajlova i koji se od njih zaista čitaju prilikom aktivacije shell-a). Za trajnu promenu na nivou sistema, a ne korisnika, pogodnije je editovati /etc/environment fajl.

Skripte

• Veoma često je poželjno automatizovati određene poslove

• Isto tako, često se koristi isti niz komandi

• Stoga je poželjno imati mogućnost da se u neki fajl upiše ono što se želi izvršiti i da se samo pozivom fajla urade željeni posloviželjeni poslovi

• Tu ulogu imaju skripte

• Pored komandi u skripte se mogu ubaciti i dodatne konstrukcije koje omogućavaju veću efikasnost u radu poput if-else, petlji, case struktura i sl.

Shebang

• Tipično se u prvoj liniji skripte navodi ko treba da interpretira skriptu

• Početak te linije predstavlja tzv. shebang string iza koga sledi navođenje interpretera skripte

• Shebang string je #!

• Primer: #! /bin/bash - ova linija navodi da se bash koristi za • Primer: #! /bin/bash - ova linija navodi da se bash koristi za interpretiranje skripte tj. da će sve komande navedene u skripti biti izvršene u bash shell-u

• Navedena prva linije ne mora da postoji u skripti, ali je preporučljivo da se ipak stavi jer se time forsira izvršenje u okruženju u kom će skripta sigurno raditi kako treba

• Kada se pokrene skripta kao program (komanda), na osnovu prve linije će se utvrditi ko treba da izvrši skriptu i aktiviraće se navedeni program (npr. bash) a sam naziv skripte će biti prosleđen kao argument

Komentari i promenljive

• Komentari počinju sa # i važe do kraja linije

• Poželjno je pisati komentare da bi drugi lakše razumeli šta je urađeno u skripti (i šta skripta radi), ali i kao sopstveni podsetnik

• Unutar skripte se mogu definisati i promenljive• Unutar skripte se mogu definisati i promenljive

• Princip je isti kao kod shell promenljivih jer to ustvari i jesu shell promenljive

• Pristupanje vrednosti promenljive se radi preko $ karaktera

• Promenljive koje se definišu unutar skripte važe samo za vreme trajanja skripte (jer važe na nivou shell-a koji je pokrenut za izvršenje skripte)

Pokretanje skripte

• Skripta se pokreće isto kao i izvršni fajl

• Ako je direktorijum u kom se nalazi skripta u $PATH promenljivoj, dovoljno je samo navesti naziv skripte (pod uslovom da ne postoji izvršni fajl ili skripta istog naziva u direktorijumu koji je ranije naveden u $PATH)

• Ako direktorijum nije u $PATH, onda se pokreće navođenjem relativne ili apsolutne putanje, uz raniju napomenu da se u slučaju da se skripta nalazi u tekućem direktorijumu mora navesti ./ ispred naziva skripte u slučaju relativne putanje

• Takođe, potrebno je aktivirati dozvolu za izvršenje tj. dozvolu x

Primer

Skripta može da se napiše npr. u vi editoru.

Treba aktivirati dozvolu za Treba aktivirati dozvolu za izvršenje tj. x. U nastavku se neće prikazivati ova aktivacija u primerima skripti.

U ovom primeru, u $PATH se nalazi i home direktorijum pa je dovoljno navesti samo naziv skripte. U suprotnom, bi skriptu trebali da pokrenemo sa npr. ./echo_skripta

Promenljiva $var1 se ne vidi nakon izvršenja skripte.

Napomena: Tipično se skript fajlovi za bash imenuju sa ekstenzijom .sh. U primerima u ovoj prezentaciji su skripte imenovane bez te ekstenzije.

Pokretanje skripte u istom shell-u

• U prethodnom primeru smo videli da se promenljiva nije prenela (zadržala) van skripte

• Razlog je što se otvorilo shell dete u okviru koga je izvršena skripta i potom se taj podshell zatvorio i vratili smo se u roditeljski (originalni) shell

• Od ranije znamo da se promenljiva ne može preneti iz shell potomka u shell roditelja

• Da bi se skripta izvršila u istom shell-u, a ne u shell detetu, potrebno je navesti source ispred pokretanja skripte (tzv. sorsovanje skripte)

• U ovom slučaju sve promenljive kreirane u skripti će opstati i nakon završetka skripte

Primer

Dodata linija koja ispisuje nivo shell-a.

Nivo je 2 tj. skripta se izvršava u shell potomku.

Promenljiva $var1 se sada vidi nakon izvršenja skripte.

Nivo je 1 tj. skripta se izvršava u istom shell-u.

Opcija set -x u skripti

• Na ranijim predavanjima smo videli da setovanjem set -x možemo da aktiviramo prikaz kako se komada tačno izvršava

• Ako se ne koristi sorsing skripte, onda će skripta biti izvršena u shell detetu i trebalo bi na početku skripte staviti set -x komanduset -x komandu

• Ali, lakši način je navesti u prvoj liniji dodatno opciju -x tj. #! /bin/bash -x

Primer

Varijanta sa -x u prvoj liniji.

Varijanta sa linijom set -x.

Primer

Ako je set -x aktiviran i radi se sorsing skripte onda ne treba ništa treba ništa menjati u skripti jer se skripta izvršava u istom shell-u u kom je i aktivirana komanda set -x.

Test

• U okviru skripti često je potrebno izvršiti određeni test pa u zavisnosti od ishoda testa uraditi jedan skup operacija ili drugi

• Komanda test omogućava raznovrsne testove nad stringovima, integer vrednostima i fajlovima

• Posto je dva načina za navođenje testa

• Prvi način je test izraz gde izraz predstavlja sam test

• Drugi način je [ izraz ] gde uglaste zagrade imaju ulogu reči test iz prvog načina

• Test se može raditi i van skripte, ali mu je tipična primena unutar skripti

Primer

Rezultat test komande (preciznije izlazni kod) je 0 (što odgovara true) ili 1 (što odgovara false). Da bi se pristupilo rezultatu može se koristiti $? Što može se koristiti $? Što predstavlja izlazni kod poslednje izvršene komande. Tipično ovaj izlazni kod označava uspeh (0) ili neuspeh (1) komande, ali ovde zavisi od rezultata testa.

Primetiti da mora postojati razmak kod zagrada, u suprotnom dolazi do greške.

Test - logički operatori i stringovi

• -a označava logičku AND operaciju

• -o označava logičku ILI operaciju

• ! označava negaciju

• -n string - dužina stringa nije 0• -n string - dužina stringa nije 0

• -z string - dužina stringa je 0

• string1 = string2 - string1 i string 2 su isti

• string1 != string2 - string1 i string 2 nisu isti

Test - integer

• broj1 -eq broj2 - broj1 = broj2

• broj1 -ge broj2 - broj1 >= broj2

• broj1 -gt broj2 - broj1 > broj2

• broj1 -le broj2 - broj1 <= broj2

• broj1 -lt broj2 - broj1 < broj2• -lt - broj1 < broj2

• broj1 -ne broj2 - broj1 <> broj2

Test - fajlovi

• fajl1 -ef fajl2 - isti su fajlovi (imaju isti inode broj)

• fajl1 -nt fajl2 - fajl1 je noviji od fajla2 (vreme modifikacije se gleda)

• fajl1 -ot fajl2 - fajl1 je stariji od fajla2 (vreme modifikacije se gleda)gleda)

• -b fajl - tip fajla je b (block) i postoji

• -c fajl - tip fajla je c (character) i postoji

• -d fajl - tip fajla je d (direktorijum) i postoji

• -e fajl - fajl postoji

• -f fajl - tip fajla je - (regularan) i postoji

• -h fajl - fajl postoji i u pitanju je simbolički link

Test - fajlovi

• -s fajl - fajl postoji i veličina fajla je veća od 0

• -S fajl - tip fajla je s (socket) i postoji

• -r fajl - fajl postoji i aktivirana je dozvola za čitanje

• -w fajl - fajl postoji i aktivirana je dozvola za upis

• -x fajl - fajl postoji i aktivirana je dozvola za izvršavanje• -x fajl - fajl postoji i aktivirana je dozvola za izvršavanje

• -G fajl - fajl postoji i grupni vlasnik je isti kao primarna grupa trenutnog korisnika

• -O fajl - fajl postoji i individualni vlasnik je trenutni korisnik

• .....

• Napomena: r, w i x testovi testiraju navedene dozvole za trenutnog korisnika (onog ko je pokrenuo test)

If konstrukcija

• Opšti oblik je:

if test1 then

komande1

elif test2 then

komande2

• Deo elif je opcion

• Isto važi i za komande2

elif test3 then

komande3

....

else

komanden

fi

• Isto važi i za else

Primer

Primetiti da je ovde pisana ; iza testa. Razlog je što je then pisan u istoj liniji kao i test i da bi se izbeglo tumačenje then kao dela testa neophodno je staviti ; iza testa. Što se tiče echo komandi, u tim linijama nije bilo potrebno pisati ; na kraju kao što ćemo videti na sledećem slajdu.

Primer

Na kraju komande nije potrebno staviti ; ako iza u liniji ne postoji više ništa. Takođe, ovde je then pisan u zasebnim linijama pa nije potrebno iza testa staviti ;. Setite se da se sve ove komande izvršavaju u shell-u isto kao kada bi bile kucane.

Linija echo fajl postoji je mogla da se stavi ispred ugnježdenog if-a i time izbegne njeno dupliranje, ali je ovde namerno rađeno na prikazani način da bi se pokazalo da može i više komandi da se stavi unutar if-a.

Case konstrukcija

• Opšti oblik je:case selektor inizbor1)

komande1;;

izbor2)

• Case konstrukcija je zgodna alternativa za if konstrukciju koja sadrži velik broj elif delova

• Poslednji izbor tj. *) označava sve vrednosti selektora koje nisu pokrivene nekim od prethodnih izbora

• Izbor predstavlja vrednost selektora pri izbor2)

komande2;;

....izborN)

komandeN;;

*)esac

• Izbor predstavlja vrednost selektora pri čemu se može navesti i pattern upotrebom karaktera *, ? i []

• Za izbor se može staviti i više vrednosti odvojenih sa |

• Izvršava se samo jedna selekcija (nije kao u C jeziku da se izvršavaju i selekcije iza izabrane)

Primer

Read se može iskoristiti unutar skripte da korisnik interaktivno unese vrednost promenljive. Može biti i više read poziva unutar skripte.

Primer

Primetiti da se izvršava samo jedna selekcija, tj. nije kao u C jeziku da se iza izabrane selekcije izvršavaju i sve preostale. Ako vrednosti selektora odgovara više izbora, biće izvršen onaj izbor koji je najranije naveden.

Napomena za read unos

Ako se želi da korisnik unese vrednost u istoj liniji gde je echo ispisao poruku, treba koristiti opciju -n echo komande (koja sprečava da se pređe u novu liniju nakon izvršenja echo komande). Ali, da se ne bi lepio unos sa porukom potreban je razmak na kraju echo komande, pa iz tog razloga poruku echo komande treba staviti pod navodnike da se ne bi razmak na kraju echo poruke ignorisao kao delimiter tokena.

Petlje

• Opšti oblik for petlje je:

for iter in opseg

do

komande

done

• Opšti oblik while petlje je:

while uslov

do

komande

done

• Opšti oblik until petlje je:

until uslov

do

komande

donedone done done

• Petlje while i until su veoma slične, razlika je što se while petlja izvršava dok je uslov ispunjen, a until petlja dok uslov nije ispunjen

• Uslov je ustvari test

• Ako se do stavi u istu liniju sa for/while/until onda iza uslova/opsega mora da ide ;

• Opseg u for petlji predstavlja opseg reči u stringu, ali može se koristiti komanda seq za generisanje numeričke petlje kao u drugim programskim jezicima

Primer za for petlju

U prvom primeru su elementi iteracije direktno navedeni. U druga dva primera su korišćeni rezultati komandi - iz tog razloga se koristi command substitution ekspanzija. Komanda seq je najpribližnija onome što je for petlja u većini programskih jezika.

Komanda seq

• Komanda seq vrši ispis niza brojeva

• Tipične varijante su:

• seq prvi poslednji - ispisuju se brojevi od prvog do poslednjeg sa korakom 1

• seq prvi korak poslednji - ispisuju se brojevi od prvog do • seq prvi korak poslednji - ispisuju se brojevi od prvog do poslednjeg sa zadatim korakom

• Ako se navede samo poslednji onda se ispisuju brojevi počev od 1

Primeri

Primer za while i until petlju

U slučaju ovih petlji neophodno je vršiti manipulaciju promenljive koja se koristi za uslov da se ne bi napravila beskonačna petlja. Na primer, ovde je beskonačna petlja. Na primer, ovde je rađen inkrement promenljive iter koja je korišćena za uslov. Primetiti da se while petlja izvršava dok je uslov ispunjen, a until petlja radi obrnuto (izvršava se dok uslov nije ispunjen).

Parametri

• Skriptama se mogu pri pozivu proslediti i parametri (mogu se posmatrati kao svojevrsni argumenti skripte)

• Parametrima se pristupa sa $i gde i predstavlja redni broj parametra (brojanje počinje od 1) - ovo su tzv. pozicioni parametri

• Ako je i ima više od jedne cifre onda se piše ${i}• Ako je i ima više od jedne cifre onda se piše ${i}

• $0 (0 je nula) predstavlja naziv skripte ili shell-a (ako se ovaj parametar koristi van skripte)

• $? predstavlja izlazni kod poslednje izvršene komande ili funkcije

• $# predstavlja broj pozicionih parametara

• $$ predstavlja ID procesa koji odgovara skripti

Parametri

• $! predstavlja ID procesa poslednje komande koja je stavljena u pozadinu (background)

• $- predstavlja trenutne opcije postavljene za shell

• $IFS predstavlja separator polja (šta se koristi kao delimiter)

• “$*” predstavlja sve pozicione parametre pri čemu se oni • “$*” predstavlja sve pozicione parametre pri čemu se oni vide kao jedna reč

• “$@” predstavlja sve pozicione parametre ali svaki parametar se vidi kao zasebna reč

• $@ i $* predstavljaju sve pozicione parametre i to svaki parametar se vidi kao zasebna reč, ali su ti parametri podložni daljoj shell ekspanziji

Primer

Primetiti da se $$ i $0 razlikuju kad su pozvani unutar skripte i u samom shell-u.

Primer

Iz ovog primera se mogu videti razlike $@ i $# sa i bez navodnika. Tipično se koriste navodnici, pri čemu tada izbor između $@ i $# zavisi od toga da li želimo argumente da posmatramo odvojeno ili kao jedan string.

Primetiti da su u varijanti bez navodnika bb i cc razdvojeni, a to uglavnom nije ono što želimo.

Parametri - shift

• Pozicioni parametri se mogu pomerati ulevo (od većih indeksa ka manjim)

• Koristi se komanda shift

• Pozicioni parametar koji je bio na indeksu 1 se gubi i više mu se ne može pristupitimu se ne može pristupiti

let i (())

• Videli smo da pomoću $(()) možemo raditi aritmetičke kalkulacije - unutar $(()) možemo staviti i promenljive, a rezultat operacije na kraju možemo dodeliti nekoj promenljivoj što smo videli na ranijim slajdovima ove prezentacije

• Alternativa je upotreba let komande koja je built-in • Alternativa je upotreba let komande koja je built-in komanda

• Umesto pisanja aritmetičkih izraza unutar $(()) konstrukcije možemo pisati iste izraze iza reči (komande) let

• Takođe, let se može koristiti za dodelu vrednosti, pri čemu se vrši automatska konverzija u decimalni broj (npr. Iz heksadecimalnog formata)

• (()) se može koristiti kao test gde su argumenti brojevi i integer promenljive

Primer

Funkcije

• Dešava se da u skripti postoji na više mesta isti kod

• Iz tog razloga u skriptama se mogu kreirati i koristiti funkcije (slično kao u većini programskih jezika)

• Funkcije mogu da imaju i ulazne parametre, a izlaz funkcije je izlazni kod (sa return se može definisati izlazni kod je izlazni kod (sa return se može definisati izlazni kod funkcije)

• Ulazni parametri se prosleđuju po sličnom principu kao što se prosleđuju pozicioni parametri skripti

• Ako se u funkciji koriste promenljive definisane u skripti one se ponašaju kao globalne promenljive

• Dozvoljena je i rekurzija funkcije

Funkcije

• Sama konstrukcija je jednostavna

ime_funkcije()

{

telo funkcije

}}

Primer

Primetiti da je u funkciji faktorijelkorišćen izlazni kod (kome se može pristupiti preko $?) za vraćanje rezultata. Samom argumentu se pristupa preko $1. Da su postojali i drugi argumenti njima bi se

Primetiti da y kreiran u funkciji važi (postoji) i van funkcije. Takođe, primetiti da je let izvršio konverziju iz heksadecimalnog zapisa u decimalni broj.

drugi argumenti njima bi se pristupalo preko $2, $3, ....

Opcije

• Skriptama se mogu proslediti i opcije, na isti način kao što se prosleđuju i komandama

• Opcijama se može finije podesiti rad skripte - na primer, koji deo koda skripte će se izvršiti ili kako će biti procesirani argumenti i sl. (kao što je slučaj i sa komandama)

• Za procesiranje opcija se koristi getopts• Za procesiranje opcija se koristi getopts

• U najprostijem formatu se poziv vrši sa getopts opcijepromenljiva

• Opcije predstavljaju listu svih opcija koje su predviđene da skripta koristi

• Promenljiva predstavlja promenljivu skripte u koju će se stavljati koja opcija je navedena prilikom poziva skripte

Opcije

• Kod komandi postojalo je više formata za navođenje opcija poput -a, -ab, --dug_naziv

• U slučaju upotrebe getopts po difoltu se radi sa kratkim nazivima opcija, a ne sa dugim nazivima (napomenimo da postoji način da se getopts prilagodi i radu sa dugim nazivima opcija)

• Takođe, neke opcije zahtevaju i navođenje argumenta

• Tada se u opcije iza dotične opcije koja zahteva argument navodi :

• Najlakši način za prolazak kroz sve opcije navedene prilikom poziva skripte je while petlja

• Prilikom poziva skripti čak i ako se koriste opcije i dalje se mogu navoditi i argumenti (pozicioni parametri) skripte iza opcija (kao i kod komandi)

Primer

Ova skripta podržava dve opcije -m i -p, gde prva opcija vrši oduzimanje, a druga opcija sabiranje. opcija sabiranje. Skripta obezbeđuje da ako su obe opcije aktivirane da se prijavi greška. Takođe, prijavljuje i prisustvo nevalidne opcije, ali se ne izlazi iz skripte u toj situaciji.

Primer - nastavak

Opcije se mogu zadavati odvojeno (-p -m), ali i zajedno (-pm). Primetiti da je skidanje opcija potrebno da bi se pristupilo argumentima počev od $1 (pogledati ispis $#, takođe videti isto na sledećem slajdu). OPTIND promenljiva nakon procesiranja svih opcija ukazuje na indeks prvog argumenta koji nije opcija, pa shift $((OPTIND-1)) vrši pomeranje za onoliko mesta koliko je bilo opcija.

Nastavak skripte sa prethodnog slajda.

Primeri rada skripte.

Primer - nastavak

U ovom primeru je korišćena skripta sa prethodna dva slajda, sa dve male modifikacije. Prva modifikacija je u liniji while getopts :pm... (dodata je dvotačka), a druga modifikacija je ispis OPTIND promenljive nakon while OPTIND promenljive nakon while petlje. Stavljanje dvotačke ispred liste argumenata (prva modifikacija) potiskuje prijavljivanje greške kad se naiđe na nepoznat parametar. Primetiti da na ovom slajdu nije prijavljivana greška nepostojeće opcije kao na prethodnom slajdu. Takođe primetiti da OPTIND vrednost zavisi od načina pozivanja parametara. Nije isto -ntm i -n -t -m.

Primer

Primer rada sa opcijama koje zahtevaju argumente. Promenljiva OPTARG sadrži argument opcije.

Primer

Ispravni primeri.

Nije naveden argument.

U ova dva primera je -c protumačen kao argument opcije -a.

Ovde je -b protumačen kao argument opcije -a, a -c je protumačen kao nevalidna opcija jer nije naveden argument iza nje.

Procesi

• Kada se pokrene neki program (aplikacija, komanda) aktivira se jedan ili više procesa zavisno od složenosti samog programa

• Kada se program završi, procesi bi trebali u normalnoj situaciji da se automatski okončaju

• Program može biti interaktivan, gde korisnik ima kontrolu nad time šta program radi i kada će njegovo izvršenje da se okonča (npr. Vim editor), ali tu spadaju i programi koje korisnik samo (npr. Vim editor), ali tu spadaju i programi koje korisnik samo pokrene poput ls komande i sličnih koje su rađene na dosadašnjim predavanjima

• Program može da bude i automatizovan (tzv. batch procesi) tj. ne mora biti vezan za terminal u kome korisnik zadaje komande tj. aktivira programe (na primer, to mogu biti zadaci/skripte koji su podešeni da se izvršavaju kad je opterećenje računara malo ili u zakazano vreme)

• Postoje i programi koji su konstantno aktivni (tzv. daemons), na primer, veb server koji mora neprestano da osluškuje da li je stigao zahtev za nekom stranicom

Procesi

• Sami procesi kada se pokrenu dobijaju svoj identifikacioni broj pomoću koga se identifikuju

• Svaki proces ima svog roditelja koji ga je kreirao (init proces je prvi proces koji se pokreće kada se učita kernel)

• Kada proces završi sa svojim radom vraća tzv. izlazni kod svom roditelju koji potom treba da zatvori processvom roditelju koji potom treba da zatvori proces

• Može se desiti da proces mora duže da čeka da ga roditeljski proces zatvori (npr. programski kod nije dobro napisan, desi se bag) - tzv. zombi procesi (ne troše resurse sistema, ali zauzimaju id broj)

• Može se desiti da se roditeljski proces okonča pre završetka procesa potomka (tipično usled neke greške) -tzv. procesi siročad (tipično ih init proces uzme kao svoje direktne potomke)

Pregled procesa

• Postoji više komandi iz terminala koje daju uvid u trenutne procese, koliko resursa zauzimaju, njihove id-eve i sl.

• Naravno, postoje i grafičke aplikacije koje se mogu koristiti

• Komande ps i top daju prikaz liste procesa

• Razlika je što ps daje prikaz procesa za trenutak u kom je izdata komanda, a top vrši neprestano osvežavanje izdata komanda, a top vrši neprestano osvežavanje prikaza

• Otuda se ps komanda samo izvrši, ispiše listu procesa i potom se terminal oslobađa za unos naredne komande, a top komanda ostaje aktivna dok je korisnik sam ne terminira (slovo q vrši izlaz iz top aplikacije)

• Komanda pstree daje prikaz stabla procesa i iz njega je lakše videti odnose između procesa i roditelj-potomak veze

ps

• Komanda koja daje pregled trenutnih procesa

• Navođenjem samo ps komande dobija se skraćeni prikaz procesa trenutnog korisnika i trenutnog terminala

• Na primer, ako bi korisnik otvorio dva terminala i u jednom od njih aktivirao ps komandu, ona bi prikazala samo od njih aktivirao ps komandu, ona bi prikazala samo procese vezane za dotični terminal (kao i proces koji predstavlja sam terminal), a ne i za onaj drugi terminal

• Skraćeni prikaz obuhvata id procesa, naziv komande koja je aktivirala proces, naziv terminala iz kog je aktiviran proces i CPU vreme koje je potrošeno na proces do tog momenta

ps

• Za detaljniji prikaz se koristi opcija -f

• Ona još dodatno prikazuje id korisnika koji je pokrenuo proces, id roditeljskog procesa, broj procesa potomaka, vreme starta procesa

• Opcija -l lista takođe detaljan prikaz - npr. prikazuje se i • Opcija -l lista takođe detaljan prikaz - npr. prikazuje se i nice vrednost procesa, memorijski prostor koji zauzima proces (u veličini stranica - tipično jedna stranica je 4096B) i dr.

• Interesantno, -f i -l prikazi imaju međusobnih razlika tj. -l ne obuhvata sve što prikazuje -f, i obrnuto

• Za prikaz svih procesa se koristi opcija

ps

• Opcija -a lista sve procese koji pripadaju i drugim korisnicima pored tekućeg korisnika, ali ne lista npr. procese koji ne pripadaju terminalima (npr. daemon procesi pokrenuti pri podizanju sistema)

• Opcija -x uključuje u prikaz i daemon procese• Opcija -p ID daje prikaz za proces čiji je ID naveden (može se

navesti i više ID-eva u liniji)navesti i više ID-eva u liniji)• Opcija -C komanda daje procese koje je aktivirala navedena

komanda• Opcijom --format=“lista” se može definisati šta se želi prikazati u

ispisu ps komande, gde lista sadrži kolone koje se žele prikazati (članovi liste se odvajaju space karakterom)

• Opcijom --sort=“lista” se može sortirati ispis ps komande, gde lista sadrži kolone za sortiranje

• Postoje i brojne druge opcije, pri čemu se neke od njih ne navode sa - ispred svog naziva (razlika u odnosu na većinu komandi)

Primer

Primer

Deo prikaza svih procesa. Proces init uvek dobija ID 1.

Primer

Primer

U terminalu je pokrenuta sudoku igra. Potom je terminal ugašen, ali je igra ostala aktivna i dalje. Na slici iznad se vidi da je u početku terminal bio roditeljski proces.

U drugom terminalu koji je otvoren se ne vidi proces vezan za sudoku igru sa ps -f komandom jer nije otvorena iz tog terminala. Kada se ukuca prikaz procesa za sudoku igru vidi se da je sada ID roditeljskog procesa drugačiji od početnog.

top

• Komanda koja daje pregled trenutnih procesa u realnom vremenu

• Opcija -d brojsekundi omogućava definisanje perioda osvežavanja prikaza

• Opcija -o kolona omogućava sortiranje po navedenoj koloni (stavljanjem + ili - ispred naziva kolone se može definisati smer sortiranja)sortiranja)

• Opcija -u korisnik daje prikaz samo procesa vezanih za navedenog korisnika

• Dok je top aktivan, tasterom f se može ući u selekciju kolona za prikaz: tasterom d se može selektovati ili ukinuti kolona (toggle princip), tasterom s se može selektovati kolona za sortiranje, a tasterom q (ili Esc) se izlazi iz selekcije - ovo uputstvo se nalazi i na samom vrhu ekrana kada se uđe u deo za izbor kolona

• Postoje i druge opcije za dinamičko menjanje prikaza (npr. taster s za promenu vremena osvežavanja)

Primer

Pokrenuta top komanda bez opcija. Prikazan je deo procesa, a prikaz se periodično osvežava. Pritiskom na taster q se izlazi iz top aplikacije.

Primer

Pokrenuta top komanda sa opcijom -o -PID kojom se sortira prikaz po PID koloni. Obrnut redosled prikaza bi bio da je stavljeno +PID umesto -PID.

Primer

Prikaz ekrana nakon pritiska tastera f kojim se ulazi u selekciju kolona za prikaz i sortiranje. U man uputstvu top komande se mogu naći sva podešavanja koja su na raspolaganju.

pstree

• Komanda koja daje prikaz stabla procesa

• Zgodno za vizuelnu analizu odnosa između procesa

• Ako se navede bez ID-a procesa prikazuje se kompletno stablo, u suprotnom se prikazuje podstablo čiji je koren navedeni procesnavedeni proces

• Opcija -a prikazuje argumente komande koja je pokrenula porces ako je to moguće

• Opcija -p prikazuje ID procesa

• Postoji i velik broj drugih opcija koje se mogu videti u uputstvu za pstree komandu

Primer

Prikazan je deo stabla.

Primer

Može se videti da su u stablu prikazani ID-evi procesa i opcije koje su korišćene za komande koje su pokrenule procese.

Primer

Zadavanjem ID procesa se može prikazati samo deo stabla tj. podstablo čiji je koren navedeni proces.

uptime

• Ova komanda prikazuje koliko dugo je sistem podignut

Opcija -p ispisuje vreme u tzv. pretty formatu (tako je nazvano u uputstvu komande).

Terminiranje procesa

• Procesi bi trebali automatski da se terminiraju kad završe svoj posao (preciznije, kad proces završi posao, obaveštava svoj roditeljski proces koji ga potom terminira)

• Međutim, dešava se da je potrebno manuelno terminirati proces

• U tu svrhu se koristi komanda kill

• Ova komanda šalje zadati signal procesu koji treba da izazove okončanje procesa

kill

• Signal koji se šalje procesu kill komandom se zadaje ili nazivom signala ili brojem signala

• Lista naziva signala i njihovih brojeva se dobija sa kill -l

• Kada se želi terminirati proces zadaje se kill komanda koju prati broj ili naziv signala koji se šalje procesu i na kraju se navodi sam proces (njegov ID) - može se navesti i više procesasam proces (njegov ID) - može se navesti i više procesa

• Signal SIGTERM (15) gasi proces regularno

• Signal SIGINT (2) daje instrukciju procesu da se ugasi, ali proces može ignorisati ovu instrukciju

• Signal SIGKILL (9) daje instrukciju procesu da se ugasi, i proces ne može ignorisati ovu instrukciju

• Signal SIGHUP (1) se koristi za deamon procese - daemon proces vrši ponovno čitanje svog konfiguracionog fajla

Primer

Primer

Kao što se vidi u datim primerima, može se navesti ime signala ili broj signala. Opcija -9 (tj. -SIGKILL) se tipično koristi kada se neka aplikacija zaglavi i regularno gašenje ne pomaže. U datim primerima su aplikacije pokretane u pozadini da bi terminal bio slobodan za izadavanje kill komande.

nice vrednost

• Tzv. nice vrednost procesa odgovara značaju tj. prioritetu procesa

• Što je veća vrednost to proces ima manji prioritet u pristupu procesoru

• Ova vrednost može biti i negativna (što je negativnija to proces ima veći prioritet)proces ima veći prioritet)

• Kada neki proces zauzima velik procenat procesorskog vremena, može se pokušati promenom nice vrednosti tog procesa na manji prioritet

• Komanda nice komanda pokreće komandu sa difolt nicevrednošću koja je tipično 10 - kada se komanda pokreće bez nice onda je tipično nice vrednost 0

• Opcija -n broj definiše sa kojom nice vrednošću se pokreće komanda

Primer

Za upotrebu nice vrednosti koja je manja od difolt vrednosti kada se komanda pokreće regularno moraju se koristiti administratorske privilegije (sudo). Primetiti da se -5 moglo navesti i bez navodnika jer nice iza opcije -n očekuje potencijalno i negativan broj. Namerno je u primerima rađeno pokretanje ps -l komande jer se odmah dobija listing nice vrednosti u NI koloni.

Promena nice vrednosti

• Nekada je potrebno promeniti nice vrednost već pokrenutog programa, na primer, kada neki proces zauzima velik procenat procesorskog vremena

• Komanda renice se koristi u tu svrhu

• Iza renice komande se prvo navodi nova nice vrednost, a potom se navodi redni broj procesa (može i više procesa da se navede)se navodi redni broj procesa (može i više procesa da se navede)

• Ako se nova nice vrednost ne navodi odmah iza renicekomande, onda se ispred nje mora navesti opcija -n

• Opcija -p ID definiše da se proces definiše preko ID-a procesa (ova opcija je difolt i ne mora striktno da se navede, sem ako ispred nje nisu korišćene druge opcije)

• Opcija -u korisnik navodi korisnika za čije procese se menja nicevrednost (može više korisnika da se navede)

Primer

Primetiti da se opcije -n i -p ne moraju navoditi, ako se prvo navodi nova nicevrednost, a odmah potom i ID procesa za koga se menja nice vrednost (prvi primer). Drugi primer koristi -n i -p da se vidi da se te opcije uvek mogu napisati.

Pokretanje komande u pozadini

• Izvršenje neke komande (programa) može da potraje

• Ako takvu komandu pokrenemo u terminalu, terminal će biti zauzet sve dok komanda ne obavi svoj posao i korisnik neće moći unositi nove komande

• Pošto nije uvek poželjno da terminal bude ‘zarobljen’, • Pošto nije uvek poželjno da terminal bude ‘zarobljen’, postoji mogućnost pokretanja komande u pozadini

• Ako se na kraju komande navede & onda se komanda pokreće u pozadini (videli smo već primere pokretanja komandi u pozadini na ranijim slajdovima), a terminal ostaje slobodan za korisnika koji može da nastavi sa unosima novih komandi

Suspendovanje izvršenja komande

• Ako komanda nije pokrenuta u pozadini, a želimo da oslobodimo terminal, CTRL+Z suspenduje izvršenje komande i vraća terminal korisniku

• Suspendovana komanda se može ponovo pokrenuti i ona će nastaviti svoj rad od onog mesta do kog je stigla u trenutku svoje suspenzijetrenutku svoje suspenzije

• Ako želimo da potpuno prekinemo rad komande i vratimo terminal korisniku može se iskoristiti CTRL+C

• Ovako okončana komanda je potpuno prekinuta i ako se ona želi ponovo izvršiti potrebno ju je ponovo pokrenuti

Pregled ‘poslova’

• Komande koje su trenutno aktivne se nazivaju poslovi (jobs) - u suštini to su procesi komandi pokrenutih u terminalu

• Komandom jobs se dobija pregled trenutnih poslova

• Uz svaki posao stoji redni broj posla

• Uz pomoć rednog broja posao se može prebaciti u pozadinu (background) ili u terminal (foreground preciznije)(background) ili u terminal (foreground preciznije)

• Redni broj se može iskoristiti i samo za prikaz željenih poslova komandom jobs (ispred samog broja se navodi %)

• Opcija -l daje i ispis ID procesa

• Opcija -p prikazuje samo ID procesa

• Opcija -r prikazuje samo poslove koji se izvršavaju

• Opcija -s prikazuje poslove koji su zaustavljeni (suspendovani)

• Opcija -n prikazuje poslove koji su promenili status od zadnjeg ispisa

Prebacivanje komande u bg i fg

• Izvršenje komandi se može prebacivati iz bg (background) i fg (foreground)

• Komande bg i fg se koriste u tu svrhu, a njihov argument je redni broj posla

• Kada se navodi redni broj ispred samog broja se stavlja %• Kada se navodi redni broj ispred samog broja se stavlja %

• Na taj način kad se sa CTRL+Z suspenduje neka komanda, ona može da nastavi sa svojim radom pokretanjem komande fg ili bg pri čemu se navodi redni broj suspendovang posla koji odgovara dotičnoj komandi

• Komanda fg će prebaciti izvršenje komande u terminal

• Komanda bg će prebaciti izvršenje komande u pozadinu

Primer

Primer

Sa CTRL+Z je suspendovan rad

Sa fg komandom je izvršenje gnome-mines prebačeno u terminal čime je terminal zarobljen.

Sa CTRL+Z je suspendovan rad aplikacije gnome-mines čime je oslobođen terminal.

Sa CTRL+C je prekinut rad aplikacije gnome-mines čime je oslobođen terminal. Može se videti da ova aplikacija više ne postoji u jobs jer je njen rad prekinut u potpunosti

Odloženo pokretanje komande

• Nekada je zgodno pokrenuti komandu (ili skriptu) odloženo, na primer, kada znamo da nećemo biti za računarom, a sama komanda (skripta) troši dosta sistemskih resursa

• Postoji više načina da se komanda pokrene u željenom trenutku

• Najjednostavniji način je sleep vreme; komanda

• Komanda sleep će obezbediti pauzu koja traje koliko je zadato • Komanda sleep će obezbediti pauzu koja traje koliko je zadato vreme, i nakon toga će se pokrenuti izvršenje zadate komande (skripte)

U ovom primeru je zadato da se posle 5 sekundi pokrene findkomanda.

Ako se želi izvršenje u pozadini, onda se ove dve komande mogu staviti u skriptu, a potom skriptu pokrenuti u pozadini. Druga varijanta je stavljanje komandi u zagradu iza koje se navodi & tj. (sleep 5; find . -name *.pdf)&

Komanda at

• Ova komanda se koristi za zadavanje trenutka izvršenja neke željene komande ili niza komandi

• Iza komande se navodi trenutak izvršenja, a potom se dobija prompt za unos željenih komandi

• CTRL+D vrši izlaz iz prompta i označava kraj unosa komandi koje želimo da se izvrše u zadatom trenutkukomandi koje želimo da se izvrše u zadatom trenutku

• Sam format vremena je veoma fleksibilan

• Midnight, noon, now, today, tomorrow, next week, 1430, 2:30 PM, 2:30 AM

• Može se operatorom + navesti i ofset u odnosu na neki zadati trenutak (minutes, hours, weeks, months, years -može da se koristi i jednina), takođe može da se koristi next umesto inkrementa za 1 npr. next hour je isto što i + 1 hour

Komanda at

• Opcija -l daje prikaz svih poslova trenutnog korisnika koji su zadati at komandom

• Opcija -f navodi fajl odakle treba da se pročitaju komande umesto da se unesu preko tastature

• Opcija -r omogućava da se neki posao obriše iz rasporeda • Opcija -r omogućava da se neki posao obriše iz rasporeda (navodi se id tog posla)

• Komanda atq se takođe može iskoristiti za pregled svih poslova trenutnog korisnika zadatih at komandom

• Komanda atrm se može iskoristiti za brisanje nekog posla iz rasporeda (navodi se ID tog posla)

Primer

Primeri upotrebe at

Primer kada se komande nalaze u fajlu

Primer

Primetiti da echo komanda koja nije redirektovana se nije pojavila u terminalu.

Komanda batch

• Nekada želimo da neku komandu (posao) izvršimo kada je sistem slabo opterećen

• Tada komanda at ne pomaže jer ona zahteva specificiranje egzaktnog vremena

• Stoga je kreirana komanda batch koja omogućava da se zadata komanda (komande) pokrene kad je opterećenje zadata komanda (komande) pokrene kad je opterećenje sistema ispod odgovarajuće granice (tipično 0.8)

• Komande se kao i kod at unose preko tastature (stdin) u otvorenom promptu (isto je CTRL+D za kraj unosa), a postoji i opcija -f kojom se može zadati fajl u kome se nalaze komande

• Za brisanje i pregled batch poslova se mogu koristiti iste komande kao i za at poslove

Cron i crontab

• Nekada želimo da neku komandu (posao) izvršavamo periodično, na primer svakog dana, svakog petka, svaka dva sata i sl.

• Komande at i batch se koriste da se željeni posao izvrši samo jednom

• Cron predstavlja daemon koji je neprestano aktivan i koji omogućava periodično izvršavanje poslova kad dođe trenutak za njihovo izvršenje

• Sami poslovi se navode u crontab fajlu (može biti više crontab fajlova)

• Komanda crontab se koristi za editovanje crontab fajlova, pregled njihovog sadržaja i sl.

crontab

• Opcija -e se koristi za editovanje crontab fajla

• Opcija -l se koristi za prikaz crontab fajla

• Opcija -r se koristi za brisanje crontab fajla

• Opcija -i radi isto što i -r, samo se dodatno postavlja pitanje korisniku da li je siguran da želi da obriše crontab fajlkorisniku da li je siguran da želi da obriše crontab fajl

• Opcija -u se koristi da se otvori crontab fajl navedenog korisnika

crontab

• Ako crontab fajl za korisnika ne postoji, pozivanje crontab -e će kreirati novi crontab fajl za korisnika

• Sam fajl na početku sadrži kratko uputstvo za pisanje poslova

• Svaki posao mora da se napiše u jednoj liniji koja sadrži 6 • Svaki posao mora da se napiše u jednoj liniji koja sadrži 6 delova (delimiter je blanko karakter)

• Prvih 5 delova predstavljaju period, a šesti deo predstavlja posao (najbolje je posao staviti u skriptu i navesti apsolutnu putanju do skripte)

• Period se navodi u sledećem redosledu: minuta, sat, dan u mesecu, mesec, dan u nedelji

• Oznaka * označava sve

crontab

• Dani u nedelji se mogu navesti brojevima 0 do 7, gde 0 i 7 odgovaraju nedelji

• Dani u nedelji i meseci se mogu predstaviti i sa tri početna slova njihovog naziva (veličina karaktera nije bitna) - npr. Fri označava petak, Jan označava januar

• Opseg se navodi sa a-b, gde je a početna vrednost, a b • Opseg se navodi sa a-b, gde je a početna vrednost, a b krajnja vrednost opsega - npr. 1-5 u polju dani u nedelji bi predstavljao radne dane (ponedeljak - petak)

• Vrednosti se mogu odvajati i zarezima, npr., 7,14 u polju za sate bi predstavljao 7h i 14h

• Mogu se i kombinovati ova dva predstavljanja

• Ako se iza opsega navede / i vrednost onda navedena vrednost predstavlja korak u tom opsegu

Primer

Ako u direktorijumu /etc postoji cron.allow fajl korisnik mora biti naveden u njemu da bi mogao koristiti crontab. Ako u direktorijumu /etc postoji cron.deny fajl korisnik ne sme biti naveden u njemu da bi mogao koristiti crontab.

Primer

Ovde je prikazan sadržaj crontab fajla pozivom opcije -l. Ako se želi izbrisati neki unos ili dodati neki novi unos, onda se poziva crontab -e i potom se crontab i potom se crontab fajl otvara u editoru i korisnik edituje sadržaj fajla.

Opcija -r briše crontab fajl.