teejuht
1. | Sissejuhatus |
2. | Süsteem 'laura' protsessid |
3. | Protsessile signaali saatmine |
4. | Jobs |
5. | Program exit code - $? |
Eelarvamuste kõigutamiseks peab kohe mainima, et multitasking
ikka on võimalik. St. et üks arvuti tegeleb korraga mitme tegevusega,
kusjuures saab tuua esile ühe või teise või kolmanda
.. . Praegu ei tule meelde, aga miski tarkvaratootja kasutab seda sõna
vastupidist olukorda märkimaks :)
Linuxis on kõik töötavad programmid nummerdatud PID
-idega (process identification). Protsessidega seoses on olemas selge seaduspära:
iga protsess on nö. mingi teise protsessi poolt sünnitatud (tegelikult
võib üks protsess ka teiseks muttuda - nii muutub nt. getty
bash -iks). Protsessil võib olla mitu last
aga lapsel võib olla ainult üks vanem.
Niisiis mitte absoluutne analoogia inimestega.
Kui süsteem käivitatakse toimub midagi sellist:
1. arvuti leiab kuidagi (nt. LILO abil) bootloader'i vajalikud osad
2. loeb üles kerneli (/vmlinuz)
3. leiab failisüsteemist üles faili /sbin/init - kõikide
protsesside ema (init-i PID = 1 ja PPID=0)
4. edasi loetakse läbi /etc/rc.d/.. scriptid (rc - run command)
ja käivitatakse palju süsteemi kui terviku seisukohalt olulisi
programme
5. lõpuks ilmub ekraanile login prompt (st. käivitatakse
getty - get tty)
6. kui getty'i saab username ja parooli siis ta käivitab bash
shelli (tegelikult getty asendab ennast bash'iga) - kasutaja login shelli.
7. sealt edasi on teie valik millised protsesse edasi teha
Protsessidega on selline tore lugu et neid saab peatada (st. ära tappa, kill, terminate) ja katkestada (suspend, stop). Peatamise ja katkestamise vahe seisneb selles, et peatatud protsessiga on kõik lõppenud aga katkestatud protsessi saab jätkama panna sellest kohast kus ta tegevus peatati. Ja veel oluline asi - igal protsessil on omanik. Olulistel protsessidel on omanikuks root. Reegel on selline, et peatada ja ära tappa saab vaid endale kuuluvaid protsesse.
Vaatame ühte tabelit kus on kirjas kõik süsteemis laura.oolberg.co (192.168.1.2) töötavad protsessid koos asjajuurde kuuluvate andmetega (ethernetis on kaks linuxi arvutit suvi (192.168.1.3) ja laura):
peale laura bootimist:
- logis tema klaviatuurilt sisse tty2-alt 'kruu' ja andis käsk
'talk [email protected]' ; suve root vastas talle talk kruu@laura
- logis tema klaviatuurilt sisse tty3 -alt 'triin' ja andis käsu
'mc'
- suvest tegi root telnet'i laurasse ja login end sisse imre alt ja
tegi 'ps fjax > psfjax' mis on all toodud
- suvest tegi root veel 'ftp laura' ja logis imre alt sisse (suvel
jookseb X)
laura protsessid, fail psfjax:
PPID PID
PGID SID TTY TPGID STAT UID TIME COMMAND
0
1 0 0 ?
-1 S 0 0:02 init
[3]
1
2 1 1 ?
-1 SW 0 0:00 (kflushd)
1
3 1 1 ?
-1 SW< 0 0:00 (kswapd)
1
4 1 1 ?
-1 SW 0 0:00 (nfsiod)
1
5 1 1 ?
-1 SW 0 0:00 (nfsiod)
1
6 1 1 ?
-1 SW 0 0:00 (nfsiod)
1
7 1 1 ?
-1 SW 0 0:00 (nfsiod)
1
13 13 13 ?
-1 S 0 0:00 /sbin/update
1
63 40 40 ?
-1 S 0 0:00 /usr/sbin/rpc.mountd
1
67 40 40 ?
-1 S 0 0:00 /usr/sbin/crond
-l10
1
54 54 54 ?
-1 S 0 0:00 /usr/sbin/syslogd
1
57 57 57 ?
-1 S 0 0:00 /usr/sbin/klogd
1
59 59 59 ?
-1 S 1 0:00 /usr/sbin/rpc.portmap
1
61 61 61 ?
-1 S 0 0:00 /usr/sbin/inetd
61
92 61 61 ?
-1 S 0 0:00
\_ in.telnetd
92
93 93 93 p0 155
S 1002 0:00 | \_ -bash
93
155 155 93 p0 155
R 1002 0:00 |
\_ ps axfj
61
145 61 61 ?
-1 S 1002 0:00 \_ ftpd: suvi.oolberg.co:imre:
IDLE
1
65 65 65 ?
-1 S 0 0:00 /usr/sbin/rpc.nfsd
1
75 75 75 ?
-1 S 0 0:00 /usr/sbin/httpd
75
76 75 75 ?
-1 S 65534 0:00 \_ /usr/sbin/httpd
75
77 75 75 ?
-1 S 65534 0:00 \_ /usr/sbin/httpd
75
78 75 75 ?
-1 S 65534 0:00 \_ /usr/sbin/httpd
75
79 75 75 ?
-1 S 65534 0:00 \_ /usr/sbin/httpd
75
80 75 75 ?
-1 S 65534 0:00 \_ /usr/sbin/httpd
75
118 75 75 ?
-1 S 65534 0:00 \_ /usr/sbin/httpd
75
119 75 75 ?
-1 S 65534 0:00 \_ /usr/sbin/httpd
1
81 81 81 ?
-1 S 0 0:00 /usr/sbin/smbd
-D
1
83 83 83 ?
-1 S 0 0:00 /usr/sbin/nmbd
-D
1
85 85 85 ?
-1 S 0 0:00 gpm -R
-m /dev/mouse -t ms
1
86 86 86 1
86 S 0 0:00 /sbin/agetty
38400 tty1 linux
1
87 87 87 2
128 S 1000 0:00 -bash
87
128 128 87 2 128
S 1000 0:00 \_ talk root@suvi
1
88 88 88 3
136 S 1003 0:00 -bash
88
136 136 88 3 136
S 1003 0:00 \_ mc
136 137
137 137 ? -1 S
0 0:00 \_ cons.saver /dev/tty3
136 138
138 138 p1 138 S
1003 0:00 \_ bash -rcfile .bashrc
1
89 89 89 4
89 S 0 0:00 /sbin/agetty
38400 tty4 linux
1
90 90 90 5
90 S 0 0:00 /sbin/agetty
38400 tty5 linux
1
91 91 91 6
91 S 0 0:00 /sbin/agetty
38400 tty6 linux
Siit tabelist saab teha hulka järledusi, kommenteerime rasvaseid ridu järjekorras:
- init'i PID (process identification) on 1 ja PPID (prosess parent
identification) on 0
- inetd on daemon mis sünnitab vajadusel ftp ja telnet'i kutsele
vastuseid
- httpd -dest on üks teiste httpd'de ema (vt. PID ja PPID numbreid)
ja nad on daemonid mis teenidavad netscapega tulnud külalisi
- gpm on hiirega tegelev programm
- tty1, 4, 5 ja 6 getty'd ootavad aga tty2 ja tty3 on getty muutunud
bash-iks ja sünnitanud uusi protsesse.
- STAT tulba S tähendab started
- ja TTY tulba ? tähendab, et protsessiga pole ühtki terminali
seotud
Kopeerisin siia alla ka veel ühe laural antud käsu output'i
(olen ju sinna imre'na sisse loginud)
laura:~$ ps axfju
USER
PID %CPU %MEM SIZE RSS TTY STAT START TIME
COMMAND
bin
59 0.0 1.3 824 312 ? S
12:26 0:00 /usr/sbin/rpc.portmap
kruu
87 0.0 2.6 1128 608 2 S
12:26 0:00 -bash
kruu
128 0.0 2.6 1116 608 2 S
12:32 0:00 \_ talk root@suvi
root
1 0.1 1.5 828 356 ? S
12:26 0:02 init [3]
root
2 0.0 0.0 0
0 ? SW 12:26 0:00 (kflushd)
root
3 0.0 0.0 0
0 ? SW< 12:26 0:00 (kswapd)
root
4 0.0 0.0 0
0 ? SW 12:26 0:00 (nfsiod)
root
5 0.0 0.0 0
0 ? SW 12:26 0:00 (nfsiod)
root
6 0.0 0.0 0
0 ? SW 12:26 0:00 (nfsiod)
root
7 0.0 0.0 0
0 ? SW 12:26 0:00 (nfsiod)
root
13 0.0 1.1 800 260 ? S
12:26 0:00 /sbin/update
root
54 0.0 1.8 836 412 ? S
12:26 0:00 /usr/sbin/syslogd
root
57 0.0 2.2 1016 520 ? S
12:26 0:00 /usr/sbin/klogd
root
61 0.0 1.4 824 336 ? S
12:26 0:00 /usr/sbin/inetd
imre
166 0.1 3.0 936 696 ? S
13:05 0:00 \_ ftpd: suvi.oolberg.co: imre:IDLE
root
92 0.0 2.2 1108 504 ? S
12:26 0:00 \_ in.telnetd
imre
93 0.0 2.6 1128 608 p0 S
12:26 0:00 \_ -bash
imre
169 0.0 1.8 892 416 p0 R
13:06 0:00
\_ ps axfju
root
63 0.0 1.8 872 412 ? S
12:26 0:00 /usr/sbin/rpc.mountd
root
65 0.0 1.8 892 420 ? S
12:26 0:00 /usr/sbin/rpc.nfsd
root
67 0.0 1.4 824 340 ? S
12:26 0:00 /usr/sbin/crond -l10
root
75 0.0 2.5 1056 584 ? S
12:26 0:00 /usr/sbin/httpd
nobody
76 0.0 2.8 1080 656 ? S
12:26 0:00 \_ /usr/sbin/httpd
nobody
77 0.0 2.8 1080 648 ? S
12:26 0:00 \_ /usr/sbin/httpd
nobody
78 0.0 2.5 1056 584 ? S
12:26 0:00 \_ /usr/sbin/httpd
nobody
79 0.0 2.5 1056 584 ? S
12:26 0:00 \_ /usr/sbin/httpd
nobody
80 0.0 2.5 1056 584 ? S
12:26 0:00 \_ /usr/sbin/httpd
nobody
118 0.0 2.5 1056 584 ? S
12:30 0:00 \_ /usr/sbin/httpd
nobody
119 0.0 2.5 1056 584 ? S
12:30 0:00 \_ /usr/sbin/httpd
root
81 0.0 2.6 1248 616 ? S
12:26 0:00 /usr/sbin/smbd -D
root
83 0.0 2.7 1096 620 ? S
12:26 0:00 /usr/sbin/nmbd -D
root
85 0.0 1.4 832 324 ? S
12:26 0:00 gpm -R -m /dev/mouse -t ms
root
86 0.0 1.2 816 292 1 S
12:26 0:00 /sbin/agetty 38400 tty1 linux
root
89 0.0 1.2 816 292 4 S
12:26 0:00 /sbin/agetty 38400 tty4 linux
root
90 0.0 1.2 816 292 5 S
12:26 0:00 /sbin/agetty 38400 tty5 linux
root
91 0.0 1.2 816 292 6 S
12:26 0:00 /sbin/agetty 38400 tty6 linux
triin
88 0.0 2.6 1124 604 3 S
12:26 0:00 -bash
triin
136 0.0 3.8 1700 876 3 S
12:34 0:00 \_ mc
root
137 0.0 1.1 812 264 ? S
12:34 0:00 \_ cons.saver /dev/tty3
triin
138 0.0 2.6 1132 600 p1 S
12:34 0:00 \_ bash -rcfile .bashrc
laura:~$
Siit on näha ka protsesside omanikud aga pole näha PPID numbreid. Ma kahjuks ei osanud anda ps 'le sellised võtmeid, et näha omanikke, PID ja PPID numbreid korraga :(
Siiamaani kõneldud jutu mõte oli anda aimu ja vahendeid (man ps) mis süsteem on ja kuidas olukorda jälgida. Jah, veel on abiks programm top - seda pole aga mõtet lihtsalt taustaks käima jätta, pidi masinat suhteliselt palju koormama.
3. Protsessile signaali saatmine
See on viisakalt öeldud. Tihti on vaja saata kaht moodi signaale:
- tappa ära: kill <PID> nt. mc tapmiseks kill 136. kui ei sure
siis saata kill -INT 136 või isegi kill -TERM 136
- lasta protsessile vastaval programmil uuesti läbi lugeda .conf
failid: nt. killall -HUP httpd web'i serveri jaoks
Tapmislusti vähendamiseks peab tunnistama, et protsesse (programme) on loomulik lõpetada programmi sisemisi vahendeid kasutades: nt. mc puhul F10. Muidu võivad protsessid zombideks muutuda ja see on halb.
Kui üks kasutaja on end masinasse vaid üks kord sisse loginud ja õiendab oma shellis, siis shell võimaldab sellist asja nagu job control (tegelikult on igal bash shellil oma jobid - st. kui on kaks xterminali lahti, siis kummagil on oma jobs list kuigi protsessid käivad ikka samal protsessoril külas :). Arvutid töötavad nii kiiresti ja inimesed nii rahulikult, et ega korraga polegi tavaliselt vaja mitut programmi tööle panna aga vahel siiski. Programmid võivad nö. käia kahes olekus:
ees - foregroundis (siis oleme proptist
ilma!)
taga - backgroundis (prompt jääb
alles aga programm töötab).
Samuti saab juba kuskil töötavaid programme viia backgroundi või tuua foregroundi.
Tavaliselt käivitatakse programm trükkides tema nimi käsureale ja vajutades reavahetust. Nii läheb ta tööle foregroundis. Nii töötavat programmi saab:
- peatada Ctrl + C -ga (see on sisuliselt kill -INT <PID> saatmine)
- katkestada (kusjuures jääb võimalus teada panna
jätkama poolelijäänud kohast käsuga fg) Ctrl+ Z -ga
Näited:
yes
käivitame programmi yes mis hakkab trükkima y tähti standard output'i.
bash # yes
y
y
y
....
Ctl + C
ja proovige ka
bash # yes
y
y
y
..
Ctl + Z
[1]+ Stopped
yes
bash #
ja
andes käsu jobs näete mis tööd parasjagu kuidas on:
bash #jobs
[1]+ Stopped
yes
bash #
ja kui tahate ta taas tööle panna siis kasuga fg
bash # fg
y
y
y
..
Lõpuks tapke ära Ctrl +C
See on muidugi loll näide :(
aastad, kuud, nadalad
kui meil on olemas näiteks kolm programmi nadalab, kuud ja aastad mis ei tee tegelikult midagi aga ekraani ka ei puutu siis saame nad korraga tööle panna selliselt:
bash# aastad &; kuud &;
nadalad &
kõige lihtsam:
#include<stdio.h>
{
while (1);
return 0;
}
see on mul ära kompilleeritud ja kopeeritud nende kolme nime alla kataloog /bin :)
ning andes käsu
bash # jobs
näeme midagi sellist:
[1] Running
aastad
[2]- Running
kuud
[3]+ Running
nadalad
kui soovime mingil põhjusel tuua neist mõne esiplaanile, siis anname käsu
fg %jobnumber
nt.
bash # fg %2
kui tahame ta nüüd korraks katkestada siis vajutame Ctrl + Z
(vaadake jobs kasuga mis sai)
kui aga taas jätkata
fg %jobnumber või
bg %jobnumber
kui aga tahame mõne ära lõpetada
kill %jobnumber
NB! toodud käske ei saa muidu anda kui prompt pole vaba. Nii et
peate vajadusel saatma kõik background'i.
Õigluse huvides olgu üteldud, et programm top näitab
hästi ära ja update'b ps -i. Proovige!
Ei väsi rõhutamast, kui olla kahest kohast ühte masinasse sisse loginud, siis on jobid eraldi nummerdatud kuivord käivad kaks shelli ja job control on shelli feature. Veelgi: fg, bg on shelli nö. sisemised käsud.
Osutub, et UNIX-is programmid ehk protsessid mitte ei lõpeta oma tööd ja kõik vaid tagastavad neid väljakutsunud keskonnale arvu näitamaks kuidas protsess lõppes. Tõsisele programmeerijale on oluline teada enamat kui siin järgnevast aga shell script'tide kirjutamiseks esialgu piisab ka sellest.
Teeme lihtsad katsed:
1.
bash # ls
mina
sina
tema
bash # echo $?
0
2.
bash # kaskmidakindlastieiole
bash: kaskmidakindlastieiole:
command not found
echo $?
127
3.
bash # ls | grep mina
echo $?
0
4.
bash # ls | grep mina
echo $?
1
niisiis, keskkonnamuutuja $? omandab viimasena
lõpetanud protsessi exit code'i väärtuse, mis on üldiselt
0 kui asi õnnestus ja mittenull kui ebaõnnestus. Siin on
paha see, et C keeles loetakse õnnestumiseks 1 ja 0 mitteõnnestumiseks
(tõene ja mittetõene loogilise tehte tulemus) . Aga mis teha,
traditsioonid, traditsioonid ...