Arvutiteaduse instituut
  1. Kursused
  2. 2020/21 sügis
  3. Operatsioonisüsteemid (LTAT.06.001)
EN
Logi sisse

Operatsioonisüsteemid 2020/21 sügis

  • Pealeht
  • Loengud
  • Praktikumid
  • Kodutööd
  • Hinded
  • Osalejad

Protsessid ja signaalid

Kohapeal olijad palun registreerige enda praktikumis osalemine vastaval veebilehel http://cs.ut.ee/reg

Protsess - Kindlaksmääratud sündmustejada, mis on piiritletud oma otstarbe või toimega, sh täitmisel olev programm või selle osa. Kui on käivitatud ühe programmi (näit. veebibrauseri) kaks eksemplari, siis töötab arvutis korraga kaks ühe ja sama nimega protsessi. Arvuti sisselülitamisel käivitatakse terve hulk protsesse, millest osa kujutavad endast opsüsteemi komponente ja osa iseseisvaid programme, mis on seatud käivituma arvuti buutimisel. Et näha, millised protsessid on parajasti aktiivsed, tuleb Windows’i arvutis vajutada korraga klahve Ctrl-Alt-Del ja käivitada Task Manager. http://www.vallaste.ee/

Tegum - Loogiliselt tervikliku otstarbega, iseseisvana täidetav programm või selle osa, opsüsteemi ressursse tarbiv töötlusüksus. (sõna protsess sünonüüm) http://www.vallaste.ee/

Programmi käivitamisel tekib protsess. Protsess on töötava programmi eksemplar mälus.

Protsessi käivitamine

Enamik käsurea käske käivitab protsessi. Sealhulgas ka käsk ps, mis väljastab protsesside nimekirja.

tambet@tambet-VirtualBox:~$ ps
  PID TTY          TIME CMD
 3475 pts/5    00:00:00 bash
 3527 pts/5    00:00:00 ps
tambet@tambet-VirtualBox:~$

Nagu näha, on ka käsk ps ise protsess - igal käivitamisel on tal erinev protsessi ID (PID).

Protsess võib pärast oma töö tegemist kohe lõpetada või jäädagi käima. Näiteks ps lõpetab oma töö kohe ja annab juhtimise tagasi käsureale, gedit aga jääb "rippuma".

tambet@tambet-VirtualBox:~$ gedit myfile.txt

Protsessi käivitamine taustal - &

Kui käivitatav protsess kestab pikemat aega või blokeerib terminali oma töö ajaks, siis on kasulikum see käivitada taustal. Selleks tuleb käsu lõppu lisada &. Sulge gediti aken ja käivita käsk nii:

tambet@tambet-VirtualBox:~$ gedit myfile.txt &
[1] 2888

Taustal käivitamisel trükitakse välja taustatöö järjekorranumber ja protsessi ID (PID). Programmi standardväljundiks (ja veaväljundiks) jääb endiselt terminal, seetõttu potentsiaalsed hoiatus- ja veateated tulevad ka hiljem terminalile. Sama juhtub ka siis, kui mõnda tavalist käsku, nt ps käivitada &-märgiga.

tambet@tambet-VirtualBox:~$ ps &
[1] 3528
tambet@tambet-VirtualBox:~$   PID TTY          TIME CMD
 3475 pts/5    00:00:00 bash
 3528 pts/5    00:00:00 ps

[1]+  Done                    ps
tambet@tambet-VirtualBox:~$ 

Taustatöö lõpetamisel trükitakse pärast esimest sisestusklahvi vajutust välja taustatöö järjekorranumber, Done ja käsk ise.

NB! Eelneva tõttu tuleb ettevaatlik olla & kasutamisel mingil muul eesmärgil, nt grep & /etc/passwd ei anna oodatud tulemust. Korrektne on sel juhul panna & märk apostroofide vahele - grep '&' /etc/passwd.

Protsesside nimekiri - ps

Kasutaja protsesside nimekirja väljastab käsk ps. Mõned näited:

ps
Kuvab jooksva terminaliga seotud protsessid.
ps -u tambet
Kuvab kõik kasutaja tambet protsessid.
ps -ef
Kuvab kõik (every) süsteemi protsessid täisandmetega (full).

Protsessi töö lõpetamine - Ctrl+C (interrupt)

Aktiivse protsessi töö lõpetab Ctrl+C. Proovi seda gediti puhul - käivita gedit blokeeruvana ja vajuta Ctrl+C - aken sulgub.

tambet@tambet-VirtualBox:~$ gedit myfile.txt

CTRL+C
tambet@tambet-VirtualBox:~$ 

Ctrl+C saadab tegelikult protsessile SIGINT signaali ja see aitab üldiselt enamikest kokkujooksnud programmidest välja. Samas on programmides võimalus ka seda ignoreerida ja mõned seda ka teevad, nt nano - veendu, et sellest ei saa Ctrl+C-ga välja minna!

tambet@tambet-VirtualBox:~$ nano myfile.txt

CTRL+C ei katkesta protsessi nano tööd, väljumiseks vajuta CTRL+X

Protsessi töö peatamine - Ctrl+Z (suspend)

Aktiivse protsessi töö peatab Ctrl+Z (tegelikult saadab SIGSTOP signaali). Proovi seda geditiga - aken hangub, seal ei tööta enam miski.

tambet@tambet-VirtualBox:~$ gedit myfile.txt

CTRL+Z
[1]+  Stopped                 gedit myfile.txt
tambet@tambet-VirtualBox:~$

Peatatud protsessi aktiveerimine - fg (foreground)

Peatatud protsessi aktiveerib uuesti käsk fg (tegelikult saadab signaali SIGCONT). Proovi seda geditiga - selleni jõuavad tagantjärele kõik peatatud seisus tehtud hiireklikid.

tambet@tambet-VirtualBox:~$ fg
gedit myfile.txt

See käsk kehtib kõigi taustal olevate protsesside kohta, nii &-märgiga käivitatud kui Ctrl+Z-ga peatatud protsesside kohta.

Peatatud protsessi viimine taustale - bg (background)

Peatatud protsessi paneb taustal käima käsk bg (sisuliselt saadab samuti signaali SIGCONT). Proovi geditiga - peata see, veendu et aken on hangunud, seejärel käivita taustal, veendu et aken töötab ja käsureal saab samuti järgmisi käske sisestada. Tekstiredaktori viimist taustale läheb vaja näiteks ssh-d kasutades.

tambet@tambet-VirtualBox:~$ gedit myfile.txt

CTRL+Z

tambet@tambet-VirtualBox:~$ bg
[1]+ gedit &
tambet@tambet-VirtualBox:~$

Protsessi viimine taustale bg käsuga on samaväärne, nagu oleks kohe alguses protsessi käivitanud &-märgiga.

Taustal olevate protsesside nimekiri - jobs

Kui käivitada taustal mitu protsessi, siis käsk jobs näitab nende nimekirja.

tambet@tambet-VirtualBox:~$ sol &
[2] 3212
tambet@tambet-VirtualBox:~$ gedit myfile.txt&
[3] 3216
tambet@tambet-VirtualBox:~$ gnome-calculator &
[4] 3220
tambet@tambet-VirtualBox:~$ jobs
[1]-  Running                 sol &
[2]-  Running                 gedit myfile.txt&
[3]+  Running                 gnome-calculator &

+ märk tähistab jooksvat taustatööd ja - märk eelmist.

Nii fg kui bg käsule saab parameetriks anda taustaprotsessi järjekorranumbri kujul %n.

tambet@tambet-VirtualBox:~$ fg %2
gnome-calculator

Ei tohiks segamini ajada ps ja jobs käske, kuigi nende sisu ja väljund on sarnane. ps näitab kõiki aktiivse terminali(akna)ga seotud protsesse, jobs aga käsurealt käivitatud taustaprotsesse. ps identifitseerib protsesse protsessi ID (PID) kaudu, jobs aga taustaprotsessi järjekorranumbri kaudu. Mõnes mõttes on fg, bg ja jobs arhailised käsud ühes terminalis mitme protsessi käivitamiseks. Tänapäeval on lihtsam uus terminali aken avada. Aga samas aitab nende teadmine teatud olukordades toime tulla (remote management, skriptimine, jne) ja selgitab ka protsesside olemust.

jobs, fg ja bg on kestprogrammi (shell) sisekäsud, need ise uut protsessi ei tekita. Protsessi tekitavad ainult väliskäsud, need mille käsufaili which on võimeline leidma.

tambet@tambet-VirtualBox:~$ which ps
tambet@tambet-VirtualBox:~$ which fg

Protsessidele signaali saatmine - kill

Kui protsess raiskab palju süsteemi ressursse, ei reageeri enam käskudele vms, siis ei jää muud üle kui see protsess tappa. Samas piisab vahepeal ka lihtsalt sellest, kui palju ressursse nõudev protsess korraks seisma panna, et kiiremad ülesanded ära teha. Seda tüüpi ülesannete jaoks on käsk kill, mille parameetriks on protsessi ID (PID) ja valikuliselt ka saadetav signaal.

tambet@tambet-VirtualBox:~$ firefox &
tambet@tambet-VirtualBox:~$ gnome-calculator &
tambet@tambet-VirtualBox:~$ gedit &
tambet@tambet-VirtualBox:~$ ps
  PID TTY          TIME CMD
 2460 pts/0    00:00:00 bash
 3055 pts/0    00:00:25 firefox
 3419 pts/0    00:00:00 gnome-calculato
 3423 pts/0    00:00:00 gedit
 3431 pts/0    00:00:00 ps
tambet@tambet-VirtualBox:~$ kill 3423

Käsk kill saadab vaikimisi protsessile SIGTERM signaali. Signaalid on lihtsustatud protsessidevahelise side vorm, millega üks protsess saab teisele teada anda mingisugusest sündmusest. Iga protsess saab määrata oma loogika, kuidas ta mingile signaalile reageerib. Standardsed signaalide tähised koos nende numbrite ja vaikimisi käitumistega on toodud siin.

Protsessi tapmine on üsna samaväärne protsessi toomisega esiplaanile ja Ctrl+C vajutamisega - SIGINT ja SIGTERM signaalid käituvad väga sarnaselt. Kui protsess on nii põhjalikult kokku jooksnud, et ka seda signaali ignoreerib, siis aitab ainult signaal SIGKILL (näiteks proovige tappa tekstiredaktorit vi):

tambet@tambet-VirtualBox:~$ vi &
tambet@tambet-VirtualBox:~$ ps
  PID TTY          TIME CMD
 3401 pts/0    00:00:00 vi
tambet@tambet-VirtualBox:~$ kill -SIGTERM 3401
tambet@tambet-VirtualBox:~$ ps
tambet@tambet-VirtualBox:~$ kill -SIGINT 3401
tambet@tambet-VirtualBox:~$ ps
tambet@tambet-VirtualBox:~$ kill -SIGKILL 3401
tambet@tambet-VirtualBox:~$ ps

Signaali nime asemel võib kasutada ka tema järjekorranumbrit, nt protsessi tapmist tähistatakse tihtipeale lihtsalt kill -9.

Mõnes olukorras võib olla mugavam kasutada kill asemel käsku pkill, mille parameetriks ei ole mitte protsessi ID, vaid käsu(faili) nimi. Siiski tasub tähele panna, et kui on käivitatud mitu samanimelist käsku, siis signaal saadetakse kõigile neile.

tambet@tambet-VirtualBox:~$ sol &
tambet@tambet-VirtualBox:~$ sol &
tambet@tambet-VirtualBox:~$ sol &
tambet@tambet-VirtualBox:~$ ps
tambet@tambet-VirtualBox:~$ pkill sol

Zombid

Linuxis ja teistes Unix-laadsetes süsteemides võib vahetevahel kokku puutuda nn zombidega: protsessidega, mis on oma töö lõpetanud, kuid mis on alles protsessitabelis. Zombiks muutub iga lapsprotsess, mille vanem veel ei tea lapse töö lõppemisest. Kopeerige järgnev python kood faili nimega zombie.py ja käivitage antud kood (fail) käsurea käsuga python3 zombie.py:

import os

def child():
   print("Uus protsess loodud", os.getpid())
#  lahku kohe, tekib zombie'''
   os._exit(0)

def parent():
   while True:
      newpid = os.fork()
      if newpid == 0:
         child()
      else:
         pids = (os.getpid(), newpid)
         print("Protsesside id-d on: %d, tytar: %d" % pids)
# iga input peale 'q' tekitab while tsyklis uue protsessi 
      if input( ) == 'q': break
parent()

Jätke zombie.py tööle, tekitage selle abil uusi lapsprotsesse (ENTER zombie.py käivitamise järel) ning Zombide otsimiseks kasutage käsku ps axu ning vaadake alajaotust STAT (täpsemalt uurige man ps alajaotust PROCESS STATE CODES). Zombie tähis on Z.

Püüdke neid teises terminalis (ps a) tappa kill käsu abil. Kas õnnestub? Ka kill -9 ei tohiks töötada, protsess kaob koos vanemprotsessi lõppemisega. Juhul kui vanemprotsess last ei kustuta, jääb protsess alles orvuna, kuuludes init protsessile. Orvud võivad tekkida vanemprotsessi kokku jooksmisel.

Protsessi käivitamine väljalogimiskindlana - nohup (no hang up)

Väljalogimisel lõpetatakse kõik kasutaja protsessid. Mõnikord võib aga tekkida vajadus näiteks ööseks mingi protsess käima jätta (näiteks ülikooli serverisse filmi alla laadima?). Väljalogimisel saavad kõik kasutaja protsessid SIGHUP signaali (HUP - hang up, pärineb ajast kui sisselogimiseks kasutati telefoniliini modemeid - väljalogimisel "pandi toru ära"). Vaikimisi käitumine SIGHUP signaali peale on protsessi töö lõpetada.

Protsessi käivitamiseks nii, et see väljalogimisel jääks edasi käima, tuleb kasutada käsku nohup. nohup asendab vaikimisi SIGHUP signaali käsitleja (handler) uuega, mis ignoreerib seda signaali. Katsetame seda käsuga sleep, mis ei tee midagi muud kui lihtsalt ootab parameetriks antud arvu sekundeid. Käivita käsk nohup sleep 10000, logi välja, logi uuesti sisse, kontrolli et see protsess endiselt käib (ps -axu | grep sleep), tapa see protsess kill käsuga.

Protsessi sisend ja väljund

Klassikalises mõttes on igal programmil sisend ja väljund, programm teostab sisendi põhjal mingid arvutused ja tagastab tulemuse väljundisse. Sellest lähtuvalt on ka igal protsessil standardsisend ja standarväljund. Vaikimisi on standardsisendiks klaviatuur ja standardväljundiks ekraan (terminal). Siin me räägime tekstipõhisest sisendist ja väljundist, graafiline kasutajaliides jääb sellest skeemist välja. Unixi protsessidel on lisaks ka veaväljund, mis on vaikimisi samuti suunatud ekraanile (terminalile).

Protsessi jaoks on sisend ja väljund lihtsalt tähemärkide vood. Osa tähemärke võivad olla eritähendusega - nt ASCII kood 10 on reavahetus, selle saatmine väljundisse tähendab, et kursor tuleb viia järgmise rea algusesse. On olemas kokkuleppelised erikoodid kursori viimiseks kindlasse kohta ekraanil, ekraani puhastamiseks, värvide muutmiseks jne. See võimaldab programmeerida interaktiivseid kasutajaliideseid, jäädes endiselt sisend-väljund paradigma piiresse.

Näiteks käsk cat ilma parameetriteta kopeerib lihtsalt standardsisendi standardväljundisse. Seetõttu kõik mis me sisestame, tuleb ekraanile topelt - kõigepealt sisestamise tulemusena (klaviatuurilt sisestatud andmed dubleeritakse reeglina terminaliprogrammi poolt standardväljundisse), teiseks sisendandmete standardväljundisse kopeerimise tulemusena:

tambet@tambet-VirtualBox:~$ cat
tere
tere
maailm
maailm
CTRL+C

See on Unixi käskude puhul väga levinud, et kui jätta failinimi parameetriks panemata, siis loetakse andmed standardsisendist.

Väljundi suunamine - >

Standardväljundit on võimalik ümber suunata, selleks tuleb käsu järele lisada > ning selle järele faili nimi:

tambet@tambet-VirtualBox:~$ ls -l >ls.txt
tambet@tambet-VirtualBox:~$ cat ls.txt
total 52
drwxr-xr-x 2 tambet tambet 4096 sept   6 14:45 Desktop
drwxr-xr-x 2 tambet tambet 4096 sept   6 14:45 Documents
drwxr-xr-x 2 tambet tambet 4096 okt    7 13:16 Downloads
-rw-r--r-- 1 tambet tambet 8942 sept   6 14:41 examples.desktop
drwxrwxr-x 2 tambet tambet 4096 okt   15 09:17 klass
-rw-rw-r-- 1 tambet tambet    0 nov    2 18:47 ls.txt
drwxr-xr-x 2 tambet tambet 4096 sept   6 14:45 Music
drwxr-xr-x 2 tambet tambet 4096 sept   6 14:45 Pictures
drwxr-xr-x 2 tambet tambet 4096 sept   6 14:45 Public
drwxrwxrwt 2 tambet tambet 4096 okt    7 13:26 temp
drwxr-xr-x 2 tambet tambet 4096 sept   6 14:45 Templates
drwxr-xr-x 2 tambet tambet 4096 sept   6 14:45 Videos

Väljundi lisamine faili - >>

Väljundi ümbersuunamine kirjutab sihtfaili alati üle. >> võimaldab väljundi lisada olemasoleva faili lõppu.

tambet@tambet-VirtualBox:~$ ls -l >>ls.txt
tambet@tambet-VirtualBox:~$ cat ls.txt
total 52
drwxr-xr-x 2 tambet tambet 4096 sept   6 14:45 Desktop
...
total 56
drwxr-xr-x 2 tambet tambet 4096 sept   6 14:45 Desktop
...

Sisendi ümbersuunamine - <

Ka protsessi sisendit on võimalik ümber suunata, selleks on <. Näiteks kui grep käsule jätta failinime parameeter lisamata, siis võtab ta oma andmed standardsisendist (ehk jääb klaviatuuri taha ootama). Seetõttu on järgmised käsud samaväärsed:

tambet@tambet-VirtualBox:~$ grep tambet /etc/passwd
tambet:x:1000:1000:Tambet Matiisen,,,:/home/tambet:/bin/bash
tambet@tambet-VirtualBox:~$ grep tambet </etc/passwd
tambet:x:1000:1000:Tambet Matiisen,,,:/home/tambet:/bin/bash

Veaväljundi ümbersuunamine - 2>

Kui cat käsule parameetriks antud faili pole olemas, siis viga selle kohta tuleb ikka ekraanile, isegi kui käsu väljund on ümber suunatud:

tambet@tambet-VirtualBox:~$ cat xyz >valjund.txt
cat: xyz: No such file or directory
tambet@tambet-VirtualBox:~$ cat valjund.txt

Põhjuseks on see, et veateated trükitakse veaväljundisse, mis on meil ümber suunamata. Veaväljundi ümbersuunamiseks tuleb > ette panna 2:

tambet@tambet-VirtualBox:~$ cat xyz >valjund.txt 2>vead.txt
tambet@tambet-VirtualBox:~$ cat vead.txt 
cat: xyz: No such file or directory

Failipidemed (file descriptors)

Eelnevas näites 2 on tegelikult veaväljundi failipideme (file descriptor) number. Iga protsessi käivitumisel on tema jaoks automaatselt avatud kolm failipidet: 0 - standardsisend, 1 - standardväljund, 2 - veaväljund. Seetõttu võib ka standardväljundi ümbersuunamiseks kasutada 1> ja standardsisendi ümbersuunamiseks 0<.

Avatud failipidemete nimekirja saab näha /proc failisüsteemi kaudu:

tambet@arendus:~$ touch firefox.in
tambet@arendus:~$ firefox 0<firefox.in 1>firefox.out 2>firefox.err &
[1] 14738
tambet@arendus:~$ ls -l /proc/14738/fd
total 0
lr-x------ 1 tambet tambet 64 Nov  3 07:37 0 -> /home/tambet/firefox.in
l-wx------ 1 tambet tambet 64 Nov  3 07:37 1 -> /home/tambet/firefox.out
l-wx------ 1 tambet tambet 64 Nov  3 07:37 10 -> pipe:[48172351]
lr-x------ 1 tambet tambet 64 Nov  3 07:37 11 -> /dev/urandom
lr-x------ 1 tambet tambet 64 Nov  3 07:37 12 -> /home/tambet/.mozilla/firefox/58qqyu61.default/XPC.mfasl
lr-x------ 1 tambet tambet 64 Nov  3 07:37 13 -> /usr/share/iceweasel/chrome/en-US.jar
lrwx------ 1 tambet tambet 64 Nov  3 07:37 14 -> /home/tambet/.mozilla/firefox/58qqyu61.default/permissions.sqlite
lr-x------ 1 tambet tambet 64 Nov  3 07:37 15 -> /usr/share/iceweasel/chrome/browser.jar
lr-x------ 1 tambet tambet 64 Nov  3 07:37 16 -> /usr/share/xulrunner-1.9.1/chrome/en-US.jar
lr-x------ 1 tambet tambet 64 Nov  3 07:37 17 -> /usr/share/xulrunner-1.9.1/chrome/classic.jar
lr-x------ 1 tambet tambet 64 Nov  3 07:37 18 -> /usr/share/xulrunner-1.9.1/chrome/toolkit.jar
lrwx------ 1 tambet tambet 64 Nov  3 07:37 19 -> /home/tambet/.mozilla/firefox/58qqyu61.default/search.sqlite
l-wx------ 1 tambet tambet 64 Nov  3 07:37 2 -> /home/tambet/firefox.err
lrwx------ 1 tambet tambet 64 Nov  3 07:37 20 -> /home/tambet/.mozilla/firefox/58qqyu61.default/places.sqlite
lr-x------ 1 tambet tambet 64 Nov  3 07:37 21 -> /home/tambet/.mozilla/firefox/58qqyu61.default/XUL.mfasl
lr-x------ 1 tambet tambet 64 Nov  3 07:37 22 -> /usr/share/iceweasel/searchplugins
lrwx------ 1 tambet tambet 64 Nov  3 07:37 23 -> /home/tambet/.mozilla/firefox/58qqyu61.default/formhistory.sqlite
lr-x------ 1 tambet tambet 64 Nov  3 07:37 24 -> /usr/share/iceweasel/chrome/classic.jar
lrwx------ 1 tambet tambet 64 Nov  3 07:37 25 -> /home/tambet/.mozilla/firefox/58qqyu61.default/content-prefs.sqlite
lrwx------ 1 tambet tambet 64 Nov  3 07:37 26 -> /home/tambet/.mozilla/firefox/58qqyu61.default/cert8.db
lrwx------ 1 tambet tambet 64 Nov  3 07:37 27 -> /home/tambet/.mozilla/firefox/58qqyu61.default/key3.db
lr-x------ 1 tambet tambet 64 Nov  3 07:37 28 -> pipe:[48172416]
l-wx------ 1 tambet tambet 64 Nov  3 07:37 29 -> pipe:[48172416]
lrwx------ 1 tambet tambet 64 Nov  3 07:37 3 -> socket:[48172300]
lrwx------ 1 tambet tambet 64 Nov  3 07:37 30 -> /home/tambet/.mozilla/firefox/58qqyu61.default/urlclassifier3.sqlite
lrwx------ 1 tambet tambet 64 Nov  3 07:37 31 -> /home/tambet/.mozilla/firefox/58qqyu61.default/cookies.sqlite
lrwx------ 1 tambet tambet 64 Nov  3 07:37 32 -> /home/tambet/.mozilla/firefox/58qqyu61.default/downloads.sqlite
lr-x------ 1 tambet tambet 64 Nov  3 07:37 4 -> pipe:[48172302]
l-wx------ 1 tambet tambet 64 Nov  3 07:37 5 -> pipe:[48172302]
l-wx------ 1 tambet tambet 64 Nov  3 07:37 6 -> /home/tambet/.mozilla/firefox/58qqyu61.default/.parentlock
lr-x------ 1 tambet tambet 64 Nov  3 07:37 7 -> pipe:[48172350]
l-wx------ 1 tambet tambet 64 Nov  3 07:37 8 -> pipe:[48172350]
lr-x------ 1 tambet tambet 64 Nov  3 07:37 9 -> pipe:[48172351]

Kui soovida veaväljundit suunata samasse, kuhu läheb standardväljund, siis võlusõna on 2>&1:

tambet@tambet-VirtualBox:~$ cat xyz >valjund.txt 2>&1
tambet@tambet-VirtualBox:~$ cat valjund.txt 
cat: xyz: No such file or directory

Siin & tähistab, et järgneb failipideme number, mitte failinimi.

Väljundi suunamine teise programmi sisendiks - |

Ühe programmi väljundi suunamine teise programmi sisendisse võimaldab lihtsatest käskudest konstrueerida kokku küllaltki keerulisi andmetöötlusjadasid. Programmide sisendi ja väljundi võimaldab kokku ühendada | ehk toru (pipe).

Näiteks süsteemi kasutajate faili kuvamine lehekülgede kaupa:

tambet@arendus:~$ cat /etc/passwd | more

Protsessinimekirjast nende kuvamine, mis sisaldavad teatud sõna:

tambet@arendus:~$ ps -ef | grep bash

Vastus teise praktikumi ülesandele "leida erinevate kasutajate arv, kelle protsesse süsteemis käib":

tambet@arendus:~$ ps -ef | tail -n+2 | cut -c-9 | sort | uniq | wc -l
9

Harutame viimase käsu juppideks:

ps -ef
kuvab kõikide protsesside nimekirja.
tail -n+2
kuva kõik read alates teisest reast.
cut -c-9
jäta sisendi igalt realt alles ainult esimesed 9 tähemärki. -c asemel on tihti vaja kasutada ka cut -d" " -f3- käsku, mis siis seab väljade eraldajaks tühiku ning jätab alles tulbad 3.ndast lõpuni. enne cut käsku on soovitav lisada käsujadasse ka käsk tr -s " ", mis eemaldab korduvad tühikud.
sort
sorteeri sisend tähestiku järjekorras (eeldus uniq käsule).
uniq
jäta korduvad read alles ühekordselt.
wc -l
loenda kokku ridade arv ja väljasta see.

Käivita neid käske alustades kõige esimesest ja lisa ükshaaval | abil järgimisi käske lõppu.

Vaata ka kokkuvõtet enamlevinud Unixi tekstitöötluskäskude kohta siit.

Ülesanded

  1. Käivita gedit taustal (& võtmega), saada talle käsuga kill SIGSTOP signaal (vt näidet juhendist), veendu et gediti aken on hangunud, seejärel saada talle SIGCONT signaal ning veendu, et gediti aken toimib jälle. Pane oma vikilehele ekraanitõmmis käskude käivitamisest oma terminaliaknas.
  2. Käivita gedit taustal & võtmega, saada sellele SIGHUP signaal ja veendu, et aken sulgus. Seejärel käivita gedit nohup käsuga, saada sellele uuesti SIGHUP signaal ning veendu, et gedit jääb käima. Pane oma vikilehele ekraanitõmmis käskude käivitamisest oma terminaliaknas, sh tõestuseks protsessi kadumise või allesjäämise kohta ps käsu väljund.
  3. Koosta ja lisa wikisse käsujada, mis kuvab (modifitseerib) ps -axu | grep snap väljundi nii et tulemuseks oleksid ainult programminimed koos lisaparameetritega näiteks snap/snap-store/467/usr/bin/snap-store --gapplication-service. Vihje: tr käsk aitab lahti saada tülikatest tühikutest. Nimekirjas peavad olema ainult programmide nimed ja nende parameetrid kõik ülejäänud peab olema eemaldatud. Lisaks ekraanpildile tuleks tuua välja ka käsk teksti kujul. Veenduge, et tulemuses on ainult "snap" sõne sisaldavad programminimed koos parameetritega. Samuti peaksid olema protsesside nimed täielikud, mitte lühemaks lõigatud.
  4. Koosta ja lisa wikisse käsujada (ip a | grep ...| ... | cut ... jne), mis kuvab ekraanile vastuseks ainult arvuti ip aadressi (enamasti 10.0.2.15) ip a käsu väljundi põhjal. NB! Käsk peaks hakkama saama ka eri pikkusega IP aadressidega (näiteks 192.168.0.123 vs 10.0.2.15). Modifitseerige eelmist käsku nii, et tulemus salvestataks faili nimega ipaddress.txt. Nüüd kontrollige tulemust käsuga xargs -n1 ping -c 2 < ipaddress.txt Lisaks ekraanpildile tuleks tuua välja ka käsk teksti kujul. Tulemus peaks välja nägema midagi sellist

Tulemus

Kui teil viki lehekülg valmis on, siis lisage meile kommentaar (koos mingi tühja failiga).

6. Praktikum 6 - Protsessi signaalid, sisendid ja väljundid
Sellele ülesandele ei saa enam lahendusi esitada.

(Tähtaeg 2 nädalat)

  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Tartu Ülikooli arvutiteaduse instituudi kursuste läbiviimist toetavad järgmised programmid:
euroopa sotsiaalfondi logo