3.6. Deemonid, signaalid ja protsesside tapmine

Redaktorit kasutades on lihtne tema tööd juhtida, panna teda faile avama jne - esiteks, kuna redaktoril on sellised võimalused sisse ehitatud ja teiseks seepärast, et redaktor on kinnistatud terminal'i külge. Mõned programmid on disainitud, nii et nad ei vaja pidevat kasutajapoolset infot, seega ühendatakse nad terminali küljest esimesel võimalusel lahti. Näiteks veebiserver vastab päev otsa ainult veebi päringutele ja ei vaja tavaliselt mingit kasutajapoolset sekkumist. Sellise programmitüübi näiteks võib tuua veel ka rakendused, mis transpordivad masinate vahel e-maili.

Selliseid programme nimetatakse deemoniteks. Deemonid olid tegelased Kreeka mütoloogias; nad olid oma olemuselt teenivad vaimud, kes ei olnud head ega halvad, kuid enamasti tegid inimkonnale kasulikke asju. See on ka põhjuseks, miks BSD maskotiks on pikka aega olnud lõbusa välimusega deemon tenniste ja kolmikhargiga.

On tavaks lisada tavaliselt deemonitena töötavate programmide nimede lõppu ``d''. BIND on näiteks lahtiseletatult Berkeley Interneti Nimedeemon (Berkeley Internet Name Daemon) ja tema programmi nimeks on named; näiteks Apache'i veebiserverit käivitatakse käsuga httpd. See on tava, mitte mingi kindel reegel; näiteks levinuim meilideemon, Sendmail, käivitatakse samuti käsu sendmail abil, mitte maild abil, nagu võiks arvata.

Mõnikord on sul vaja deemonprotsessiga suhelda. Neid suhtlusmeetodeid nimetatatkse signaalideks ja sa saad deemoni (või ka ükskõik millise muu protsessiga) suhelda, saates sellele signaali. On olemas palju erinevaid signaale, mida saad saata--mõned neist omavad spetsiifilist tähendust, osad on samas interpreteeritavad rakenduse enda poolt ja rakenduse dokumentatsioon kirjeldab, kuidas programm neid signaale interpreteerib. Sa saad saata signaali ainult protsessile, mis on sinu oma. Kui sa üritad signaali saata kellegi teise protsessile, siis seda ignoreeritakse. Erandiks on siinkohal root-kasutaja, kes saab saata signaale kõigi protsessidele.

FreeBSD saadab ka ise mõningatel juhtudel rakendustele signaale. Näiteks kui rakendus on kehvasti kirjutatud ja üritab ligi pääseda mälule, millele tal ligipääs puudub, siis saadab FreeBSD protsessile Segmentation Violation signaali (SIGSEGV ). Kui rakendus on kasutanud süsteemi funktsiooni alarm(3) , et teda mingi aja möödumisel teavitataks, siis saadetakse talle alarmisignaal (Alarm, SIGALARM) jne.

Protsessi peatamiseks saab kasutada kahte signaali, SIGTERM ja SIGKILL. SIGTERM on viisakas viis protsessi tapmiseks; protsess võib selle signaali kinni püüda, saada aru, et sa tahad et ta töö lõpetaks, sulgeda logifailid, mis võivad olla avatud, ja üleüldse lõpetada töö, millega iganes ta antud hetkel parajasti ei tegele. Mõningatel juhtudel võib protsess isegi ignoreerida SIGTERM-signaali, näiteks kui tal on parajasti mingi ülessanne käsil, mida ei saa katkestada.

SIGKILL-signaali protsess ignoreerida ei saa. See on sisult signaal kujul ``Mind ei huvita, mida sa teed, lõpeta see koheselt'' Kui sa saadad protsessile SIGKILL-signaali, siis FreeBSD peatab selle protsessi koheselt.[1].

Teised signaalid, mida sul võib vaja minna, on SIGHUP , SIGUSR1 ja SIGUSR2. Need on üldotstarbelised signaalid ja erinevad rakendused teevad nende saamise järel erinevaid asju.

Oletame, et sa muutsid oma veebiserveri seadistuste faili-- sa tahaksid serverile öelda, et ta oma seadistusi uuesti loeks. Sa võiksid httpd protsessi peatada ja uuesti käivitada, aga siis ei vastaks su server lühikese perioodi jooksul päringutele, mis võib olla soovimatu. Enamik deemoneid on kirjutatud nii, et nad loevad SIGHUP-signaali saamise järel oma seadistuste faili uuesti. Seega selle asemel, et httpd tappa ja uuesti käivitada, saadad sa talle lihtsalt SIGHUP-signaali. Kuna neile signaalidele reageerimise kohta pole mingit standardit, reageerivad erinevad deemonid neile ka erinevalt, seega loe kindlasti vastava deemoni dokumentatsiooni.

Signaalide saatmiseks kasutatakse käsku kill(1). Selle kohta ka järgnev näide.

Protsessile signaali saatmine

See näide näitab, kuidas saata signaali programmile inetd(8). inetd(8) seadistuste fail on /etc/inetd.conf ja inetd(8) loeb oma seadistuste faili uuesti sisse, kui talle SIGHUP saadetakse.

  1. Otsi üles protsessi ID, millele sa tahad signaali saata. Seda saad teha käskude ps(1) ja grep(1) abil. Käsku grep(1) kasutatakse väljundist sinu antud stringi otsimiseks. Seda käsku saab kasutada tavakasutajana ja inetd(8) töötab root-kasutaja õigustega, seega peab ps(1) saama argumentideks ax.

    % ps -ax | grep inetd
      198  ??  IWs    0:00.00 inetd -wW

    Niisiis on inetd(8) PID 198. Mõningatel juhtudel on väljundis ka grep inetd käsk. See tuleneb viisist, kuidas ps(1) peab protsesside nimekirja otsima.

  2. Kasuta signaali saatmiseks käsku kill(1). Kuna inetd(8) töötab root-kasutaja õigustes, siis pead sa enne kasutama käsku su(1),et saada root-kasutajaks.

    % su
    Password:
    # /bin/kill -s HUP 198

    Nagu paljud teisedki UNIX®i käsud, ei väljasta ka kill(1) midagi, juhul kui kõik läheb hästi. Kui sa üritad saata signaali protsessile, mida sa ei oma, siis näed sellist veateadet:`` PID: Operation not permitted'' (keelatud operatsioon). Kui sa kirjutad PIDi kogemata valesti, siis saadad signaali kas valele protsessile, mis võib lõppeda halvasti, või kui sul veab, siis protsessile, mida ei eksisteeri. Sellisel juhul näed sa järgnevat veateadet: ``kill: PID: No such process''(sellist protsessi ei ole).

    Miks kasutada käsku /bin/kill?: Paljud shellid omavad oma sissehitatud kill- käsku; st. shell saadab signaali otse, mitte ei käivita /bin/kill-käsku. See on mõningatel juhtudel küll väga kasulik, aga erinevatel shellidel on ka erinev süntaks, mille abil määratakse saadetava signaali nimi. Lihtsam on lihtsalt kasutada käsku /bin/kill ... , kui üritada kõikide shellide vastavat süntaksit õppida.

Teiste signaalide saatmine käib sarnaselt, lihtsalt pane asemele TERM või KILL või misiganes muu signaal, mida sul vaja läheb.

Important: Süsteemis suvalisi protsesse tappa pole hea mõte. Eriti eriline on init(8) protsessi IDga 1. Käsk /bin/kill -s KILL 1 on kiireks süsteemi kinnipanekuks. Kontrolli argumendid, mis sa annad programmile kill(1), alati üle, enne kui vajutad ENTERit.

Notes

[1]

See pole tegelikult täiesti tõsi--on olemas mõned asjad, mida ei saa katkestada. Näiteks kui protsess üritab faili teisest arvutist üle võrgu lugeda ja teine arvuti on mingil põhjusel kadunud (kas kinni pandud või on tegemist võrgu veaga), siis öeldakse, et protsess on ``katkestamatu''. Lõpuks protsess aegub, tavaliselt 2 minuti pärast. Niipea kui aegumine on toimunud, tapetakse ka protsess.