Izvršavanje zadataka¶
Zadaci:
Pokrenuti naredbenu ljusku.
Pokrenuti naredbu za ispis sadržaja direktorija.
Ponoviti prethodni zadatak, no kao argument upisati putanju nepostojećeg direktorija /direktorijNEpostoji.
Povezati dvije naredbe u lanac, tako da se nakon ispisa sadržaja direktorija prikaže poruka o uspješnosti radnje.
POMOĆ: Za povezivanje više naredbi koristi se znak “;”. Naredbena ljuska će u liniji sve argumente prije navedenog znaka smatrati jednom naredbom, a nakon znaka nekom drugom naredbom, pa sve do slijedećeg znaka ; (ako postoji).
PRIMJER:
echo “Ispis korijenskog direktorija”;cd /;ls;echo -en “n”;echo “Ispis korisničkog direktorija”;cd;ls
U gornjem primjeru je povezano 7 zasebnih radnji u lanac. Svaka naredba će se izvršiti tek po dovršetku prethodne. Bitno je naglasiti kako slijedeća radnja ne ovisi o uspješnom pokretanju prethodne, već je bitno samo da se proces dovrši.
Jedina naredba koju bi bilo dobro objasniti je echo -en “\n”. Naredba echo služi za ispis nekog teksta na standardni izlaz, dok opcija -e služi za raspoznavanje i interpretaciju backslash znakova \ (podsjetiti se čemu služi n kombinacija, do značenja je moguće doći i čitanjem manpage echo naredbe), a opcija -n ne dodaje još jedan novi redak nakon izvršavanja naredbe.
Povezati dvije naredbe u lanac, no sa prvom naredbom pokušati ispisati sadržaj nepostojećeg direktorija /direktorijNEpostoji, a zatim ispisati poruku o grešci. Ovisi li slijedeća naredba o uspješnosti izvršavanja prethodne?
Proučiti manpage naredbe sleep. Povezati dvije naredbe u lanac, tako da se nakon 20 sekundi spavanja prikaže na ekranu poruka “BUDJENJE”. Kada se izvršila druga radnja?
Ponoviti prethodni zadatak, no za vrijeme odbrojavanja nasilno prekinuti proces kombinacijom tipki CTRL+C. Je li se izvršila druga radnja? Pokušati zaključiti zašto.
POMOĆ: Pomoću operatora && i || je moguće uvjetovati izvršavanje slijedeće naredbe, ovisno o uspješnosti prve. Prvi operator zahtijeva uspješan završetak za izvršavanje slijedeće naredbe, dok drugi zahtijeva neuspješan završetak. U ovom trenutku je potrebno spomenuti termin kod izlaznog statusa (eng. exit code status). Svaki završetak nekog zadatka ili procesa će rezultirati određenom vrijednošću koda izlaznog statusa . Iako su moguće različite vrijednosti, završetak programa će najčešće rezultirati vrijednošću 0 (ako je program izvršen bez grešaka) ili 1 (ako je program neuspješno izvršen). Općenito gledajući, svaki završetak programa sa izlaznim kodom različitim od nule podrazumijeva neku grešku.
http://tldp.org/LDP/abs/html/exitcodes.html
Najjednostavniji način za prikaz izlaznih kodova je korištenje dvije aplikacije (proučiti manpage obje aplikacije): true i false. Varijabla $? prikazuje status zadnje izvršene radnje u ljuski. Ako je više naredbi povezano u lanac, prikazuje se status zadnje naredbe u lancu.
ids@ids2 ~ $ true; echo $?
0
ids@ids2 ~ $ false;echo $?
1
Nakon osnovnog pojašnjenja izlaznih kodova, mogu se uvrstiti operatori && i ||, čija će funkcija biti najbolje prikazana kroz slijedeća četiri primjera.
ids@ids2 ~ $ true && echo USPJEŠNO USPJEŠNO
ids@ids2 ~ $ true || echo NEUSPJEŠNO
ids@ids2 ~ $ false && echo USPJEŠNO
ids@ids2 ~ $ false || echo NEUSPJEŠNO NEUSPJEŠNO
Kao što se može uočiti , samo dvije kombinacije će prouzročiti prikazivanje prikladne poruke na standardni izlaz.
ZADATAK: Dobro proučiti gornje kombinacije dok se ne shvati logika izvršavanja.
Ponoviti zadatke 2. i 3., te nakon svakog izvršavanja programa ispisati izlazni status (varijabla $?).
Ponoviti zadatke 2. i 3., no koristeći operatore && i ||, ispisati poruke o uspješno ili neuspješno izvršenoj radnji.
Pokrenuti process spavanja od 10 sekundi, te zadatak preusmjeriti u pozadinsko izvršavanje. Što se može prvo uočiti? Treba li korisnik čekati završetak procesa?
POMOĆ: Dugotrajni zadaci se često preusmjeravaju u pozadinsko izvršavanje. Radnja se postiže upisivanjem znaka & nakon naredbe procesa. Zadatak se u tom trenutku odvaja od ljuske (eng. fork), te dobiva svoj zasebni broj zadatka (eng. job number) i poseban broj procesa (eng. PID, Process ID). Za pregled aktivnih zadataka se koristi naredba jobs. Bez dodatnih opcija, u popisu aktivnih zadataka prikazivati će se samo redni broj zadatka (uz prikaz zadane naredbe). Ako se želi prikazati i PID zadatka, potrebno je koristiti i opciju -l. Za prekidanje izvršavanja zadatka, koristi se naredba kill, sa argumentom rednog broja zadatka ili broja procesa. Svi primjeri su prikazani ispod.
PRIMJER:
ids@ids2 ~/LINUX_PRIMJERI $ sleep 120 & [1] 20712
ids@ids2 ~/LINUX_PRIMJERI $ jobs [1]+ Running sleep 120 &
ids@ids2 ~/LINUX_PRIMJERI $ jobs -l [1]+ 20712 Running sleep 120 &
ids@ids2 ~/LINUX_PRIMJERI $ kill %1 [1]+ Terminated sleep 120
ids@ids2 ~/LINUX_PRIMJERI $ sleep 120 & [1] 20817
ids@ids2 ~/LINUX_PRIMJERI $ kill 20817 [1]+ Terminated sleep 120
Za istovremeno pokretanje više pozadinskih zadataka, umjesto standardnog znaka ;, koristi se & znak. Bitno je naglasiti kako se svi pozadinski procesi izvršavaju samostalno, te ne ovise o završetku prethodnog zadatka. Dakle, ovakav način izvršavanja se ne može nazivati vezanjem u lanac. Ovakav način izvršavanja je asinkronog tipa (sinkroni zadaci ovise o prethodnima). Slijedeći primjer će prikazati pokretanje 3 pozadinska procesa sa različitim vremenima izvršavanja, te se može primijetiti kako se prvo završavaju zadaci sa najkraćim vremenom izvršavanja.
PRIMJER:
ids@ids2 ~/LINUX_PRIMJERI $ sleep 20 & sleep 5 & sleep 10 & [1] 24740 [2] 24741 [3] 24742
ids@ids2 ~/LINUX_PRIMJERI $ [2]- Done sleep 5 [3]+ Done sleep 10 [1] Done sleep 20
Pokrenuti dva zasebna procesa u pozadini koji će ispisivati sadržaj direktorija (jedan proces neka prikaže sadržaj korijenskog direktorija, a drugi /etc direktorija). Koji proces se prvi izvršio do kraja? Zašto?
Pokrenuti proces spavanja od 60 sekundi. Pauzirati proces, te ga preusmjeriti u pozadinsko izvršavanje. Što se dogodilo sa procesom nakon pauziranja? Vratiti nazad proces u prvi plan.
POMOĆ: Ako se trenutno aktivan proces želi preusmjeriti u pozadinu, potrebno ga je pauzirati kombinacijom tipki CTRL-Z, te naredbom bg (eng. BackGround) poslati u pozadinsko izvršavanje. Suprotna radnja se postiže naredbom fg (eng. ForeGround).
PRIMJER:
ids@ids2 ~/LINUX_PRIMJERI $ sleep 30 ^Z [1]+ Stopped sleep 30
ids@ids2 ~/LINUX_PRIMJERI $ bg %1 [1]+ sleep 30 &
ids@ids2 ~/LINUX_PRIMJERI $ jobs [1]+ Running sleep 30 &
ids@ids2 ~/LINUX_PRIMJERI $ fg %1 sleep 30