Poglavlje 11 - Kontrola procesa Pokrenuti program se naziva proces. Pod pojmom procesa podrazumijevaju se stvari od X sustava pa do sistemskih programa (deamons) koji se pokreću kada se diže sustav. Kada se proces pokreće, postaje vlasništvo onoga tko ga je pokrenuo. Procesi koji se pokreću prilikom podizanja sustava su obično u vlasništvu root ili nobody korisnika. Procesi koje vi pokrenete postaju vaši. Procesi koje su pokrenuli drugi korisnici su njihovi, tj. njihovo vlasništvo. Vi imate kontrolu nad svim procesima koje ste pokrenuli. Korisnik root ima kontrolu nad svim sistemskim procesima, uključujući one koje su pokrenuli drugi korisnici. Procesi se mogu kontrolirati i nadzirati pomoću više aplikacija, kao i naredbi ljuske. 11.1 Procesi u pozadini Program koji pokrenete u naredbenoj liniji se pokreće u prvom planu. To vam omogućava promatranje izlaza programa i interakciju s programom. Međutim, postoji nekoliko slučajeva kada želite pokrenuti program a da vam on ne zauzima terminal. Taj način korištenja se zove pokretanje programa (procesa) u pozadini, i postoji nekoliko načina kako to uraditi. Prvi način postavljanja procesa u pozadinu je stavljanje znaka & nakon naredbe za pokretanje programa. Na primjer, pretpostavimo da želite pomoću aplikacije za puštanje mp3 pjesama koja radi u naredbenom retku (amp) reproducirati pjesme iz direktorija u kojem se nalaze mp3-ice, ali želite raditi nešto drugo i istom terminalu. Slijedeća linija će pokrenuti aplikaciju amp u pozadini: % amp *.mp3 & Aplikacija će se uredno pokrenuti, i vratiti će prompt. Drugi način postavljanja procesa u pozadinu je njegova postavljanje dok on još radi. Prvo, pokrenite program. Dok on radi, pritisnite kombinaciju tipki Ctrl+z. Proces dobija status "suspeniranog". To zapravo znači da je njegovo izvođenje naprosto pauzirano. Trenutno je njegovo izvođenje prekinuto, ali izvođenje može biti nastavljeno u svakom trenutku. Jednom kad suspendirate proces, dobivate prompt. Proces možete postaviti u pozadinu tako da utipkate: %bg Sada suspendirni proces radi u pozadini. 11.2 Procesi u prvom planu Ako vam treba interakcija sa procesom koji se izvodi u pozadini, možete ga postaviti natrag u prvi plan. Ukoliko imate samo jedan proces u pozadini, možete ga pozvati natrag tako da utipkate: %fg Ako program nije završio sa izvođenjem, tada program preuzima kontrolu nad terminalom i nećete dobiti prompt. Ponekad program može završiti sa izvođenjem dok se izvodi u pozadini. U tom slučaju ćete dobiti poruku sličnu ovoj: #ubacit To vam govori da je pozadiniski proces (u ovom slučaju to je ls, koji nije pretjerano zanimljiv) završio sa izvođenjem. Moguće je imati više procesa u pozadini u isto vrijeme. Kada se to dogodi, trebate znati koji proces želite vratiti u prvi plan. Samo upisivanje naredbe fg će vratiti u prvi plan onaj proces koji je poslijednji stavljen na izvođenje u pozadini. Što ako imate cijeli niz procesa koji se izvode u pozadini? Na sreću, bash ljuska sadrži naredbu koja ispisuje sve procese. Naredba se zove jobs i daje ispis sličan ovome: #ubacit Ta vam naredba omogućava ispis svih procesa u pozadini. Kao što možete vidjeti, svi su zaustavljeni. To znači da su svi procesi suspendirani. Brojevi služe za raspoznavanje (ID) procesa u pozadini. ID sa znakom plusa poslije njega (man ps) je proces koji će biti postavljen u prvi plan ako samo utipkate fg. Ako želite postaviti vim u prvi plan, tada utipkajte: % fg 1 i vim će biti prikazan na konzoli. Postavljanje procesa u pozadinu može biti veoma korisno ako imate samo jedan otvoreni terminal preko dialup veze (modem). Možete imati nekoliko programa koji se izvršavaju u pozadini na jednom terminalu i povremeno nadzirati njihov rad pozivajući ih u prvi plan. 11.3 ps Sada ste naučili kako postavljati izvođenje procesa u pozadinu i kako ih pozivati natrag u prvi plan. Također znate da se na sustavu istodobno izvodi priličan broj procesa. Pa kako vidjeti sve te procese (programe)? Možete koristiti naredbu ps(1). Ova naredba ima mnoštvo mogućnosti, ovdje će biti opisane samo one najvažnije. Za potpuni pregled mogućnosti naredbe ps, pogledajte u priručniku (man ps). Korištenje priručnika (manual) je detaljno opisano u dijelu 2.1.1. (#link) Samim upisivanjem naredbe ps dobiti ćete ispis procesa koji su pokrenuti na vašem terminalu. To uključuje procese u prvom planu (što uključuje ljusku koju koristite, i naravno, sam ps). Procesi u pozadini su također prikazani. Dosta puta, imati ćete kratki ispis: Primjer 11-1. Osnovni ispis naredbe ps #ubacit Iako name puno procesa na ispisu, informacija je dosta tipična. Bez obzira koliko procesa imali pokrenuto, pokretanjem ps naredbe imati ćete iste stupce (PID, TTY, TIME, CMD). Što oni zapravo znače? PID (Process ID) je jedinstveni identifikator svakog procesa i vrijednosti su u rasponu od 1 do 32767. Svaki proces dobiva slijedeći slobodni PID. Kada proces završi sa izvođenjem (ili bude prekinut, kao što ćete vidjeti u slijedećem dijelu), oslobađa svoj PID. Kada je dosegnut najveći mogući PID, počinje se od najnižeg slododnog. TTY označava na kojem terminalu se proces izvodi. Kada samo upišete ps dobivate ispis programa koji su pokrenuti na trenutnom terminalu, tako da svi procesi imaju istu informaciju u TTY stupcu. Kao što možete vidjeti, oba ispisana procesa se izvode na ttyp0. To označava da su procesi pokrenuti ili sa udaljenog računala ili sa X terminala ili slično. TIME stupac označava koliko se procesorskog vremena proces izvršava. To vrijeme je različito od vremena izvršavanja procesa. Zapamtite da je Linux višezadaćni (multitasking) operativni sustav. Mnogo je procesa koji se istodobno izvršavaju i ti procesi dobivaju djeliće procesorskog vremena. Znači, u TIME stupcu će biti prikazano vrijeme koje je manje od onoga koje je proteklo od pokretanja procesa. Ako dobijete ispis od nekoliko minuta u TIME stupcu, to može značiti da nešto nije u redu. Na kraju, u CMD stupcu se prikazuju imena programa. Ispisuje se samo imena programa, bez okidača iz naredbene linije ili sličnih informacija. Da bi vidjeli ostale informacije, potrebno je koristite dodatne mogućnosti ps naredbe. Samo ćemo se dotaći toga. Možete dobiti potpuni ispis procesa pokrenutih na sustavu korištenjem prave kombinacije mogućnosti. To će vjerojatno prouzrokovati u dugom popisu procesa (55 na mojem prijenosnom računalu dok pišem ovu rečenicu), pa ću skratiti ispis: %ps -ax #ubacit Većina od ovih procesa se pokreće se pokretanjem sustava. Ja sam napravio nekoliko izmjena na svom sustavu, pa će vam ispis biti ponešto drugačiji. Ipak, većina procesa iz ovog popisa će biti pokrenuta i na vašem sustavu. Kao što možete vidjeti, ova mogućnost daje ispis okidača koji su dodani naredbi. Nedavno je ranjivost jezgre (kernel) u ptrace uzrokovala izmjenu ps naredbe tako da se ne prikazuju baš svi okidači koji su dodani naredbi. Te naredbe su sada prikazane u uglatim zagradama kao u gorenjem ispisu za procese s PID-ovim od 108 do 110. Isto tako, dodani su još neki stupci i neki zanimljivi izrazi. Prvo što možete primjetiti je to da je većina ispisanih procesa pokrenuta na tty "?". Ti procesi nisu vezani niti uz jedan određeni terminal. Taj slučaj je najčešći kod servisa (deamons), koji rade bez da se vežu uz bilo koji određeni terminal. Uobičajeni servisi (deamons) su sendmail, BIND, apache, i NFS. Oni obično čekaju na zahtjev klijenta i vraćaju nekakav odgovor kada to klijent zatraži. Tu je novi stupac: STAT. U njemu su prikazani statusi procesa. S označava spavanje (sleeping): proces čeka na određenu aktivnost. Z označava proces koji je nešto kao živi mrtvac (zombie). Takav proces je onaj kojemu je ugašen proces-roditelj a koji ima procese-djecu koji nisu zaustavljeni. To nije dobar slučaj. D označava proces koji je ušao fazu "spavanja" koju nije moguće prekinuti. Takvi procesi često odbijaju zaustavljanje, čak i onda kad im je poslan SIGKILL signal (više o SIGKILL signalu u slijedećem dijelu: kill). W označava straničenje. Mrtvi procesi su označeni sa X. Proces označen sa T je praćen (traced), ili zaustavljen. R označava da je proces pokrenut. Ako želite vidjeti još više informacija o pokrenutim procesima, utipkajte slijedeće: % ps -aux #ubacit Dobijate gomilu informacija. U osnovi, tu je prikazano koji je korisnik pokrenuo proces, koliko sistimskih resursa proces troši (stupci %CPU, %MEM, VSZ i RSS) i kada je proces pokrenut. Očigledno, to je mnoštvo informacija koje mogu dobro doći administratoru sustava. Tu na vidjelo izlazi još jedna stvar: informacije prelaze granice prikaza pa ih nije sve moguće vidjeti. Okidač -w služi za dobijanje prelamanja dugih linija. Prikaz nije previše lijep, ali služi svrsi. Imate potpun ispis za svaki proces. Čak postoje i dodatne informacije koje možete dobiti za svaki proces. Detaljno provjerite priručnik o naredbi ps. U svakom slučaju, gore spomenute mogućnosti su najpopularnije i najčešće ćete samo njih i koristiti. 11.4 kill Ponekad se dogodi da vam se program čudno ponaša i vi ga trebate dovesti u red. Program za tu svrhu je kill(1), koji se može koristiti za upravljanje procesima na više načina. Najočigledniji način korištenja naredbe kill je ubijanje (zaustavljanje) procesa. Proces ćete poželjeti zaustaviti kada se njegov rad izmakne kontroli i zauzima mnogo sistemskih resursa a vi jednostavno ne želite čekati da se prekine. Da bi zaustavili određeni proces, morate znati njegov PID ili njegovo ime. Ta bi dobili PID, koristite naredbu ps a kojoj je bilo riječ u prethodnom dijelu. Na primjer, da bi zaustavili proces sa ID-om 4747, uradite slijedeće: % kill 4747 Primjetite da morate biti vlasnik tog procesa da bi ga mogli zaustaviti. To je sigurnosna značajka. Ako vam se dozvoli zaustavljanje procesa u vlasništvu drugih korisnika bilo bi moguće raditi mnoge štetne stvari. Naravno, root korisnik može zaustaviti bilo koji proces na sustavu. Postoji druga inačica naredbe kill a to je naredba killall(1). Ta naredba radi točno ono što joj samo ima kaže: zaustavlja sve pokrenute procese određenog imena. Ako želite zaustaviti sve pokrenute vim procese, samo upišite slijedeće: % killall vim Time će biti zaustavljeni sve vim procesi. Ako to uradite kao root korisnik zaustavljate sve vim procese svih korisnika. To donosi zanimljiv način kako da izbacite sve (uključujući i sebe) sa sustava: # killall bash Ponekad naredba kill ne radi svoj posao. Određeni procesi se neće zaustaviti preko kill naredbe. U tom slučaju je porebno koristiti moćniji oblik naredbe kill. Ako proces sa ID-om 4747 odbija zaustavljanje preko kill naredbe, uradite slijedeće: % kill -9 4747 To će gotovo sigurno uzrokovati zaustavljanje tog procesa. Možete uraditi istu stvar sa naredbom killall. Korištenjem ovog oblika naredbe kill zapravo šaljemo drugačiji signal procesu. Obična kill naredba šalje SIGTERM (zaustavljanje) signal procesu, koji procesu kaže da završi s radom, počisti iza sebe, i završi sa izvođenjem. Oblik: kill -9 šalje SIGKILL (ubijanje) signal procesu, koji ga, u biti, trenutno zaustavlja tj. ubija. Procesu tada nije dozvoljeno da počisti iza sebe, i može doći do gubitka podataka kada zaustavljate proces sa SIGKILL signalom. Dostupni su vam još i brojni drugi signali. Da dobijete ispis svih dostupnih signala upišite: % kill -l Uz naredbu kill je potrebno koristiti brojeve, dok se ime procesa može koristiti sa killall naredbom (uz odbacivanje prefiksa "SIG"). Evo jedan primjer: % killall -KILL vim Poslijednja upotreba kill naredbe je ponovno pokretanje procesa. Slanjem SIGHUP signala većina procesa ponovno učitava svoje konfiguracijske datoteke. To je posebno korisno kada želite da sistemski procesi učitaju konfiguracijske datoteke koje ste upravo izmjenili. 11.5 top Na kraju, evo naredbe koju možete koristiti za prikazivanje informacija u procesima na sustavu koje se ažuriraju u stvarnom vremenu. Naredba se zove top(1), a tako se i pokreće: % top Dobiti ćete prikaz o pokrenutim procesima preko cijelog prikaza, kao i neke informacije o radu sustava. To uključuje prosječno opterećenje (load average), broj procesa, opterećenje procesora, informacije o slobodnoj memoriji, i detalje vezane za procese koji uključuju PID, korisnika, važnost (priority), korištenje procesora i memorije, vrijeme izvršavanje i ime programa. #ubacit Naredba se zove top zato što će najaktivniji procesi biti ispisani na vrhu (top). Zanimljivo je to da će naredba top izlisati samu sebe na vrhu na većini sustava, bez obzira na njegovo korištenje sistemskih resursa. U svakom slučaju, naredba top je dosta korisna kada želite vidjeti koje se proces čudno ponaša i zahtjeva gašenje. Pretpostavimo da želite nadzirati samo svoje vlastite procese, ili samo proces koji je u vlasništvu drugog korisnika. Vama zanimljiv proces možda neće biti jedan od onih koji najviše zauzimaju procesor. Okidač -u dozvoljava upisivanje korisničkog imena ili UID-a (User ID), pa na taj način možete pratiti samo procese koji su u vlasništvu toga korisnika (UID). % top -u alan #ubacit Kao što možete vidjeti, ja trenutno koristim X, top, i gnome-terminal (u kojem ovo pišem) i mnoge druge aplikacije ovisne o grafičkom okruženju koje troše najviše procesorskog vremena. Ovo je dobar način provjere koliko pojedini korisnik opterećuje vaš sustav. Naredba top također podržava praćenje procesa po njihovim ID-ovima, ignorirajući nezaposlene (idle) i zombi procese, kao i mnoge druge mogućnosti. Najbolji način za upoznavanje svih mogućnosti naredbe top je, naravno, priručnik.