Praktikum 6 - Protsessid ja signaalid
Protsess – Kindlaksmääratud sündmuste jada, mis on piiritletud oma otstarbe või toimega, sh täitmisel olev programm või selle osa. Kui on käivitatud ühe programmi (nt 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 Windowsi 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
Käsurida vabaneb, kui protsess oma töö lõpetab (graafiliste programmide puhul programm suletakse). Jõuga saab protsessi töö käsureal lõpetada klahvikombinatsiooniga CTRL
+C
, kus C
tähendab Cancel
.
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).
ps -axu
- Kuvab kõik süsteemi sarnaselt ef võtmetele.
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 gedit
i 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
, mistõttu tulevad potentsiaalsed hoiatus- ja veateated 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 &
-märgi kasutamisel mingil muul eesmärgil, nt grep & /etc/passwd
ei anna oodatud tulemust. Korrektne on sel juhul panna &
ülakomade vahele – grep '&' /etc/passwd
.
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. Ctrl
+C
on käsurea funktsionaalsus, seega tuleb klahvikombinatsioon sisestada käsureal mitte gedit aknas või mujal graafilises keskkonnas.
tambet@tambet-VirtualBox:~$ gedit myfile.txt CTRL+C tambet@tambet-VirtualBox:~$
Ctrl+C
saadab tegelikult protsessile SIGINT
-signaali ja see aitab üldiselt enamikust 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. Ctrl
+Z
on käsurea funktsionaalsus, seega tuleb klahvikombinatsioon sisestada käsureal mitte gedit aknas või mujal graafilises keskkonnas.
tambet@tambet-VirtualBox:~$ gedit myfile.txt CTRL+Z [1]+ Stopped gedit myfile.txt tambet@tambet-VirtualBox:~$
PS! Peaksite märkama, et taustal muutub gedit
programm tume-halliks ja pärast paari sekundit tuleb teade "Text Editor" is not responnding
, kus võite valida Wait
. Teil ei õnnestu peatatud gedit
programmiga midagi teha, isegi akent liigutada, enne kui äratate ta uuesti üles (vaata järgmist punkti juhendis, kuidas seda teha).
Oluline on mõista, et kuigi näiliselt CTRL
+Z
klahvikombinatsioon toimib sarnaselt CTRL
+C
kombinatsioonile Linuxis, siis nende käitumine on sisuliselt väga erinev. Z
paneb käsu magama 'Zz..leep
, kuid programm ja sellega seotud ressursid jäävad ootele. C
ehk C..ancel
lõpetab ka sisuliselt programmi töö ehk vabastatakse protsessiga seotud kõik ressursid.
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 kohe alguses protsessi &-märgiga käivitamisega.
Taustal olevate protsesside nimekiri – jobs
Kui käivitada taustal mitu protsessi, siis käsk jobs
näitab nende nimekirja. Pane järgnevad programmid tööle samalt käsurealt &
-märgiga ja ära neid kohe sulge.
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 %3 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 terminaliaken avada. 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 käsu kill
asemel käsku pkill
, mille parameetriks ei ole mitte protsessi-ID, vaid käsu(faili) nimi. Siiski tasub tähele panna, et kui käivitatud on mitu samanimelist käsku, siis signaal saadetakse neile kõigile.
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 Unixi-laadsetes süsteemides võib vahetevahel kokku puutuda nn zombidega: protsessidega, mis on oma töö lõpetanud, kuid mis on protsessitabelis alles. Zombiks muutub iga lapsprotsess, mille vanem veel ei tea lapse töö lõppemisest. Kopeerige järgnev Pythoni 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 kasutage zombide otsimiseks käsku ps axu
ja vaadake alajaotust STAT
(täpsemalt uurige man ps
i alajaotust PROCESS STATE CODES
). Zombi 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. 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. 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õpetamine.
Protsessi käivitamiseks nii, et see jääks väljalogimisel 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 standardvä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 tuleb kõik, mis me sisestame, 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 <
. Kui näiteks 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 on 2 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 standardväljundi ümbersuunamiseks kasutada ka 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). Püstkriipsu ehk |
sümboli saate eesti klaviatuuri puhul Linuxis alt gr
+ <>|
klahvikombinatsiooniga. NB! CTRL
+ALT
ei ole alati operatsioonisüsteemides samaväärne alt gr
klahviga. Virtuaalmasinas leiate püstkriipsu ka Input
-> Keyboard
-> Soft keyboard
-> Layout list
(keelevaliku nupp all paremal) -> Deutsch T1 (German)
. US
klaviatuuril on kasutusel nn väike ENTER
aga Eesti asetusel suur. Seetõttu on enamasti sobivaim valida Rootsi asetus, selle puudusel näiteks Saksa asetus.
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
- kuva kõikide protsesside nimekiri.
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 3ndast lõpuni. Ennecut
-käsku on soovitatav lisada käsujadasse ka käsktr -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
- loe kokku ridade arv ja väljasta see.
Käivita neid käske, alustades kõige esimesest, ja lisa ükshaaval | abil järgmisi käske lõppu.
Vaata ka kokkuvõtet enamlevinud Unixi tekstitöötluskäskude kohta siit.
Ülesanded
Järgnevad ülesanded on kontrollimaks teie praktikumi jooksul omandatud oskusi ja teadmisi, seetõttu ei pruugi ülesanne püstitus ja sellele soovitud lahenduskäik kõige optimaalsem olla. Seega on teie omandatud teadmiste ja oskuste kontrolliks oluline, et te järgiksite ülesande kirjelduses olevaid lahenduskäike ja nõudeid.
- Käivita
gedit
käsurealt, nüüd peata programmi töö ajutiselt klahvikombinatsioonigaCTRL
+Z
, veendu, etgedit
i aken on hangunud, seejärel saada talleSIGCONT
-signaal ning veendu, etgedit
i aken toimib jälle. Pane oma aruandesse ekraanitõmmis käskude käivitamisest oma terminaliaknas. - Käivita
gedit
taustal&
-võtmega, saada selleleSIGHUP
-signaal ja veendu, et aken sulgus. Seejärel käivitagedit
nohup
-käsuga, saada sellele uuestiSIGHUP
-signaal ning veendu, et gedit jääb käima. Nüüd sisesta käsk, millega saadnohup
i käivitatudgedit
i protsessi sulgeda. Pane oma aruandesse ekraanitõmmis käskude käivitamisest oma terminaliaknas, sh tõestuseks protsessi kadumise või allesjäämise kohtaps
-käsu väljund. - Koosta ja lisa aruandesse käsujada, mis kuvab (modifitseerib) käsu
ps -axu | grep daemon
väljundi (ehk siis käsurea algus on fikseeritud) nii, et tulemuseks oleksid ainult programminimed koos lisaparameetritega (näiteksavahi-daemon: running [Perenimi-U22.local]
). Vihje:tr
-käsk aitab lahti saada tülikatest tühikutest. Nimekirjas peavad olema ainult programmide nimed ja nende parameetrid, kõik ülejäänu peab olema eemaldatud. Lisaks ekraanipildile tuleks tuua välja ka käsk teksti kujul. Veenduge, et tulemuses on ainult sõne "daemon" sisaldavad programminimed koos parameetritega. Samuti peaksid protsesside nimed olema täielikud, mitte lühemaks lõigatud. - Koosta ja lisa aruandesse 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 nimegaipaddress.txt
. Nüüd kontrollige tulemust käsugaxargs -n1 ping -c 2 < ipaddress.txt
. Lisaks käsujadale tuleb esitada ka ekraanipilt. Tulemus peaks välja nägema umbes selline:
Tulemus
Praktikumi eelpool oleva nelja ülesande vastused tuleb panna GitHub/GitLabi dokumenti nimega praktikum6.md ja esitada moodles hindamiseks.
Otselink esitamisele: https://moodle.ut.ee/mod/assign/view.php?id=1204366
(Tähtaeg 2 nädalat)