Signaalid ja kill: Difference between revisions
kill muud kasutused ja kokkuvõte |
viited, uued alapealkirjad |
||
Line 6: | Line 6: | ||
== Sissejuhatus == | == Sissejuhatus == | ||
UNIX-tüüpi op. süsteemides on signaalid on asünkroonsed sõnumid, mida kasutatakse, et protsessi millestki teavitada. Asünkroonsus tähendab seda, et sõnumid võivad sündmustena aset leida mistahes ajahetkel.<ref> | UNIX-tüüpi op. süsteemides on signaalid on asünkroonsed sõnumid, mida kasutatakse, et protsessi millestki teavitada. Asünkroonsus tähendab seda, et sõnumid võivad sündmustena aset leida mistahes ajahetkel.<ref>https://www.csd.uoc.gr/~hy345/assignments/2013/cs345_front1.pdf CS345 OPERATING SYSTEMS System calls & Signals Panagiotis Papadopoulos, Τμήμα Επιστήμης Υπολογιστών]</ref> | ||
Järgnevalt pisut juttu sellest, mismoodi signaalid töötavad ja lõpus mõned näited, kuidas neid ise kasutada saab. Artikkel eeldab, et lugeja on varem UNIX-tüüpi op. süsteemi näinud ning teab, mis on protsessid ja shell. | Järgnevalt pisut juttu sellest, mismoodi signaalid töötavad ja lõpus mõned näited, kuidas neid ise kasutada saab. Artikkel eeldab, et lugeja on varem UNIX-tüüpi op. süsteemi näinud ning teab, mis on protsessid ja shell. | ||
Line 74: | Line 74: | ||
Huvitav trivia -- käsk ps ilma argumentideta näitab meie terminali id'd ja ka mitmenda terminali instantsiga tegu | Huvitav trivia -- käsk ps ilma argumentideta näitab meie terminali id'd ja ka mitmenda terminali instantsiga tegu | ||
== Kill | == Kill == | ||
Signaalide saatmiseks shelli käsurealt või skriptist kasutatakse käsku ''kill''. | Signaalide saatmiseks shelli käsurealt või skriptist kasutatakse käsku ''kill''. | ||
Et näha erinevate signaalitüüpide valikut, tuleb trükkida: | Et näha erinevate signaalitüüpide valikut, tuleb trükkida<ref>[http://man7.org/linux/man-pages/man1/kill.1.html kill(1)]<ref>: | ||
kill -l | kill -l | ||
Line 89: | Line 89: | ||
kill -9 564 | kill -9 564 | ||
Kill käsu süntaks on väga paindlik. Katsetamise tulemusel leidsin, et sama tulemuse annavad kõik järgnevad käsud: | Kill käsu süntaks on väga paindlik. Katsetamise tulemusel leidsin, et sama tulemuse annavad kõik järgnevad käsud<ref>[https://www.youtube.com/watch?v=lP7xoqkqDZQ Linux Sysadmin Basics -- 6.1 Process Signals]<ref>: | ||
kill -SIGTERM 564 | kill -SIGTERM 564 | ||
Line 124: | Line 124: | ||
Et saata internetiteenuste serverile (inetd) signaal, et ta oma konfiguratsioonifaili uuesti sisse laeks: | Et saata internetiteenuste serverile (inetd) signaal, et ta oma konfiguratsioonifaili uuesti sisse laeks: | ||
kill -s HUP ''inetd pid'' | kill -s HUP ''inetd pid'' | ||
== Killall == | |||
== Pkill == | |||
== Graafiline kill == | |||
See sõltub ilmselt päris palju distrost, aga vajuta ALT+F2. Trüki tekkivasse aknasse '''xkill''' ja löö enterit. Hiirekursor muutub ristiks. Selle ristiga graafilisele aknale klõpstates protsess tapetakse. | |||
== Kokkuvõte == | == Kokkuvõte == | ||
Nimekirja linuxis kasutatavatest signaalidest leiab näiteks trükkides:<ref>http://man7.org/linux/man-pages/man7/signal.7.html signal(7)</ref> | Nimekirja linuxis kasutatavatest signaalidest leiab näiteks trükkides:<ref>[http://man7.org/linux/man-pages/man7/signal.7.html signal(7)]</ref> | ||
man 7 signal | man 7 signal | ||
Siit tuleb jällegi välja omakorda huvitav nüanss, et linuxi käskudel võib olla mitu man legekülge. Nimekirja nägemiseks trüki: | Siit tuleb jällegi välja omakorda huvitav nüanss, et linuxi käskudel võib olla mitu man legekülge. Nimekirja nägemiseks trüki: | ||
man -k "^signal" | man -k "^signal" | ||
man -k "^kill" | |||
Tasub siiski alati kontrollida, millised on konkreetses süsteemis kasutusel kasutades käsku ''kill -1''. | Tasub siiski alati kontrollida, millised on konkreetses süsteemis kasutusel kasutades käsku ''kill -1''. | ||
Ja isegi kui kõik vajalikud parameetrid on välja uuritud, tasuks ikkagi kaaluda kas SIGKILL käsk end hetkel õigustab.<ref>http://turnoff.us/geek/dont-sigkill/ The Real Reason to Not Use SIGKILL</ref> | Ja isegi kui kõik vajalikud parameetrid on välja uuritud, tasuks ikkagi kaaluda kas SIGKILL käsk end hetkel õigustab.<ref>[http://turnoff.us/geek/dont-sigkill/ The Real Reason to Not Use SIGKILL]</ref> | ||
==Viited== | ==Viited== |
Revision as of 00:47, 6 November 2017
Autorid
Ulvar Petmanson, AK22, 2011
Henri Paves, AK21, 2017
Sissejuhatus
UNIX-tüüpi op. süsteemides on signaalid on asünkroonsed sõnumid, mida kasutatakse, et protsessi millestki teavitada. Asünkroonsus tähendab seda, et sõnumid võivad sündmustena aset leida mistahes ajahetkel.[1]
Järgnevalt pisut juttu sellest, mismoodi signaalid töötavad ja lõpus mõned näited, kuidas neid ise kasutada saab. Artikkel eeldab, et lugeja on varem UNIX-tüüpi op. süsteemi näinud ning teab, mis on protsessid ja shell.
Signaalid
Signaalid saadetakse alati tuuma poolt, kuid algatus võib tulla:
- teistelt protsessidelt (kasutades "kill" käsku)
- protsessilt endalt. Siia alla käivad ka riistvaralised erandid. Näiteks nulliga jagamise puhul või kui üritatakse pöörduda eraldamata mäluruumi poole, saadetakse signaal vigasele programmile.
- tuumalt. Tuum kasutab signaale, et teavitada protsessi teatud süsteemsetest sündmustest. Kui protsess tellib omale "süsteemse äratuse", ka siis saadab tuum protsessile singaali, iga kord, kui aeg täis saab (nt. iga 10 sek tagant).
Mis juhtub, kui protsess saab signaali? See sõltub: protsess saab iga signaali kohta määrata, mida tuum sellega tegema peab, kas:
- ignoreerida: Signaali saades ei juhtu midagi. Signaali ignoreerimine peab olema enne selle signaali saamist tellitud. Kõiki signaale ei saa eirata.
- kinni püüda: Sel puhul kutsub tuum välja defineeritud erirutiini. See erirutiin peab olema enne signaali saatmist registreeritud.
- kasutada vaikimisi sätteid: Igale signaalile on süsteemselt määratud vaikimisi toiming, mis täidetakse, kui protsess ei ole sellele signaalile ignoreerimist või erikohtlemist tellinud.
Üldistavalt toimub signaali saatmine nii:
- 1. Kui protsess saab signaali, mida ei ignoreerita, siis programmi täitmine katkestatakse
- 2. Kontroll antakse üle vastavale singaalihändlerile
- 3. Peale signaalihändleri töö lõpetamist jätkatakse programmi sealt, kus pooleli jäädi.
Signaali saab saata ainutl protsessile, mis on sinu oma. Kui üritada saata signaali kellegi teise protsessile, siis seda ignoreeritakse. Erandiks on siinkohal root-kasutaja, kes saab saata signaale kõigi protsessidele.
Praktikas on signaali saatmise mehhanism natuke keerukam ja koosneb kahest sammus: signaali genereerimine ja signaali kohaletoimetamine. Tuum genereerib protsessi jaoks signaali lihtsalt nii, et seab üles lipu, mis näitab, millise signaalitüübiga on tegu. Täpsemalt, igal protsessil on mäluosa, mida kasutatakse ootavate signaalide jaoks. Süsteemi jaoks tähendab signaali tekitamine lihtsalt õige biti (vastavalt signaali tüübile) muutmist selles mäluosas. Sellest hetkest on signaal ootel. Enne kasutajaruumi protsessile kontrolli üle andmist, kontrollib tuum alati, kas protsessil on ootel signaale. Kui avastatakse ootel signaal, siis süsteem toimetab selle signaali kohale ühel järgnevatest viisidest:
- kui signaaliks on SIGKILL, siis tapetakse protsess ära,
- kui signaaliks on SIGSTOP, siis peatatakse protsess ja pannakse magama,
- kui protsess ei registreerinud selle signaali jaoks ühtki erihändlerit, siis tehakse vaikimisi toiming. Kui vaikimisi toiming on ingoreerimine, siis ei tehta midagi ja süsteem lülitub tagasi kasutajarežiimi ja annab kontrolli protsessile üle. Kui vaikimisi toiming ei ole signaali eiramine, siis jäädakse tuumarežiimi ja protsess sulgetakse, tehakse tõmmis (core dump) või protsess peatatakse.
- kui protsess on registreerinud sellele signaalile erihändleri, siis annab tuum kontrolli tagasi protsessile ja kasutajarežiimis käivitatakse signaali erihändler. Siit jääb signaali töötlemine protsessi enda kanda.
Tähele tasub panna, et tuum käivitab singaalihändleri siis, kui signaal kohale toimetatakse, mitte siis, kui signaal genereeritakse. Signaali kohaletoimetamine toimub vaid hetkel, kui sihtprotsess muudetakse aktiivseks. Ehk, signaali tekitamise kohaletoimetamise vahel võib olla märgatav ajaline vahe.
Tegelikult on protsessil veel üks võimalus, ta võib lasta tuumal blokeerida mingi kindla signaali kohale toimetamise. Kui signaal on blokeeritud, siis singaal genereeritakse ikka, aga ta jääb ootele. Signaal toimetatakse kohale alles siis, kui protsess blokeeringu maha võtab. Signaali blokeerimist kasutatakse koodi kriitilistes kohtades, kus programm ei tohi peatuda.
Signaalide käsitsi saatmine
Lihtsaim viis saata signaale terminalis esiplaanil töötavale protsessile on kasutada klaviatuuri:
Ctrl+C: protsessile saadetakse signaal SIGINT (protsessi töö katkestatakse)
Ctrl+Z: protsessile saadetakse singaal SIGTSTP (protsess pannakse ajutiselt seisma, kontroll antakse tagasi shellile). Protsessi saab tagasi esiplaanile tuua käsuga fg
Protsessi tuvastamine
Protsessile saab saata signaali teades tema täielikku nime, või siis tema protsessi ID'd (pid).
Kui tead, mis on protsessi *täpne* nimi, nt "skypeforlinux", mitte lihtsalt "skype", siis saab seprotsessi IDid'i leida käsuga:
pidof protsessi täisnimi
Kui sa protsessi pid'i ei tea, siis saab selle leida käsuga ps. See on üldiselt praktilisem lahendus kui eelmine, sest nagu eelnevast näitest selgus, on tarkvara ja selle protsessi nimi tihtipeale teineteisest erinevad.
Et näha protsesse enda kasutaja alt:
ps -ux
Et näha protsesse kõikide kasutajate alt:
ps -aux
Et näha protsesse kindla kasutaja alt:
ps -U kasutajanimi
Filtreerimiseks kasuta grep'i:
ps -aux | grep protsessi nimi või nimeosa
Huvitav trivia -- käsk ps ilma argumentideta näitab meie terminali id'd ja ka mitmenda terminali instantsiga tegu
Kill
Signaalide saatmiseks shelli käsurealt või skriptist kasutatakse käsku kill.
Et näha erinevate signaalitüüpide valikut, tuleb trükkidaCite error: Closing </ref>
missing for <ref>
tag
man 7 signal
Siit tuleb jällegi välja omakorda huvitav nüanss, et linuxi käskudel võib olla mitu man legekülge. Nimekirja nägemiseks trüki:
man -k "^signal"
man -k "^kill"
Tasub siiski alati kontrollida, millised on konkreetses süsteemis kasutusel kasutades käsku kill -1.
Ja isegi kui kõik vajalikud parameetrid on välja uuritud, tasuks ikkagi kaaluda kas SIGKILL käsk end hetkel õigustab.[2]
Viited
http://ph7spot.com/musings/introduction-to-unix-signals-and-system-calls
http://www.bsd.ee/handbook/x3750.html
http://www.cyberciti.biz/faq/unix-kill-command-examples/
- ↑ https://www.csd.uoc.gr/~hy345/assignments/2013/cs345_front1.pdf CS345 OPERATING SYSTEMS System calls & Signals Panagiotis Papadopoulos, Τμήμα Επιστήμης Υπολογιστών]
- ↑ The Real Reason to Not Use SIGKILL