Anketa

Ktorý návod by ste cheli ako ďalší?:

Partenské projekty

FreeBSD - Démoni, signály a ukončovanie procesov

Verzia pre tlačSend by emailPDF verzia

Keď spustíme editor, môžeme pomocou neho otvárač súbory, upravovať ich atď. Môžeme to robiť vďaka tomu, že editor poskytuje funkcie, ktoré to umožňujú a vďaka tomu, že editor je pripojený k terminálu. Niektoré programy sú však navrhnuté tak, aby bežali bez používateľských vstupov, a preto sa pri prvej príležitosti od terminálu odpoja. Napríklad webový server venuje celý deň odpovedaním na webové požiadavky, pričom od nás nepotrebuje žiaden vstup. Ďalším príkladom takýchto programov sú programy, ktoré posielajú elektronickú poštu z jednej stránky na druhú.

Tieto programy nazývame démoni. Démoni sú postavy v gréckej mytológii: neboli ani dobrý ani zlý, vykonávali však veľké veci pre ľudstvo, podobne ako webové servery a mailové servery vykonávajú dnes. To je dôvod, prečo maskot BSD už dlhší čas vyzerá ako veselý démon v teniskách s vidlami.

Dohodnutým zvykom je, že programy, ktoré bežia ako démoni majú na konci názvu písmeno “d”. BIND je skratený názov programu od Berkeley Internet Name Domain, no názov súboru, ktorý sa spúšťa je named; program Apache je webový server a spúšťa sa pomocou súboru httpd; program na zaraďovanie dokumentov do tlače sa spúšťa pomocou súboru lpd atď. Toto je však len dohodnutý zvyk a nie pravidlo. Napríklad hlavný démon na posielanie pošty aplikácie Sendmail sa spúšťa súborom sendmail, a nie maild ako by sme čakali.

Niekedy je potrebné s procesmi démonov komunikovať. Jeden zo spôsobov ako sa dá, je poslať im (alebo inému bežiacemu procesu) signál. Existuje mnoho rôznych signálov, ktoré sa dajú poslať – niektoré z nich majú špeciálny význam, iné sa interpretujú aplikáciami. Informácie o tom, ktoré signály aplikácia dokáže spracovať, sa nachádzajú v dokumentácii aplikácie. Signály sa dajú poslať iba procesom, ktoré vlastníme. Ak chceme poslať signál pre proces niekoho iného pomocou kill(1) alebo kill(2), bude nám odopretý prístup. Výnimku má správca root, ktorý môže posielať signály všetkým procesom každého používateľa.

Signály procesom niekedy odosiela aj samotný systém FreeBSD. Ak je aplikácia zle vytvorená a pokúša sa pristupovať do pamäte, čo nie je povolené, systém FreeBSD odošle procesu signál Segmentation Violation  (SIGSEGV). Ak aplikácia používa systémové volanie alarm(3) na pravidelné upozorňovanie, bude jej odoslaný signál Alarm (SIGALRM), atď.

Na zastavenie procesu sa používajú dva signály SIGTERMSIGKILL. SIGTERM je zdvorilý spôsob na ukončenie procesu – proces môže zachytiť signál, vykonať potrebné úkony pred vypnutím, zatvoriť otvorené súbory so záznamami a vo všeobecnosti dokončiť svoju prácu pred vypnutím. V niektorých prípadoch môže proces signál SIGTERM ignorovať ak je uprostred vykonávania operácie, ktorá nesmie byť prerušená.

Signál SIGKILL proces nesmie ignorovať. Tento signál znamená "Nezaujíma ma čo práve robíš, skonči hneď”. Ak procesu odošleme signál SIGKILL, potom systém FreeBSD proces ihneď zastaví[1].

Medzi ostatné často používané signály patria SIGHUP, SIGUSR1SIGUSR2. Tieto signály sú určené na všeobecné použitie a ak ich pošleme do rôznych aplikácií, každá môže na tieto signály zareagovať inak.

Predstavme si, že sme zmenili konfiguračné súbory webového servera a chceli by sme povedať webovému serveru aby si nanovo načítal svoju konfiguráciu. Môžeme reštartovať démon httpd, no to spôsobí, že webový server bude na určitý čas nedostupný. Väčšina démonov je vytvorených tak, aby na signál SIGHUP zareagovali načítaním svojho konfiguračného súboru. Takže namiesto zastavenia a opätovného spustenia démona httpd mu môžeme poslať signál SIGHUP. Pretože odpoveď na tento signál nie je pevne stanovená, iní démoni sa môžu správať inak. Pred použitím signálov je potrebné prečítať si dokumentáciu k danému démonovi.

Ako sme už spomenuli, signály sa posielajú pomocou príkazu kill(1).

Odoslanie signálu procesu

Tento príklad hovorí o tom, ako sa posiela signál démonovi inetd(8). Konfiguračný súbor démona inetd je /etc/inetd.conf a ak démonovi inetd odošleme signál SIGHUP načíta svoju konfiguráciu.

  1. Nájdeme identifikátor procesu, ktorému chceme poslať signál. Urobíme to pomocou ps(1)grep(1). Príkaz grep(1) sa používa na vyhľadávanie zadaného reťazca vo výstupe. Keďže tento príkaz spustíme ako bežný používateľ a je spustený inetd(8) pod správcom root, je potrebné spolu s príkazom ps(1) použiť voľby ax.

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

    Takže PID procesu inetd(8) je 198. V niektorých prípadoch sa môže vo výstupe objaviť aj príkaz grep inetd . Je to preto, že príkaz ps(1) ho nájde medzi bežiacimi procesmi.

  2. Použijeme príkaz kill(1) na odoslanie signálu. Kvôli tomu, že inetd(8) beží pod správcom root, musíme použiť príkaz su(1) aby sme sa najskôr stali správcom root.

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

    Podobne ako pri väčšine príkazov UNIX®, ani príkaz kill(1) nezobrazí žiadnu správu ak je úspešný. Ak odošleme signál procesu, ktorý nevlastníme, potom sa zobrazí správa “kill: PID: Operation not permitted”. Ak sa pomýlime pri zadávaní PID, buď odošleme signál nesprávnemu procesu (čo môže byť zlé), alebo (ak máme šťastie) odošleme signál na  PID, ktorý sa momentálne nepoužíva a uvidíme správu “kill: PID: No such process”.

    Prečo používať /bin/kill?: Mnoho systémových rozhraní shell poskytuje príkaz kill ako zabudovaný príkaz. Tp znamená, že  shell pošle signál priamo a nespúšťa /bin/kill. To môže byť veľmi užitočné, no sheell rozhrania mávajú rozdielnu syntax pri zadávaní názvu signálu, ktorý sa má odoslať. Miesto toho aby sme sa ich museli všetky naučiť, je jednoduchšie používať priamo príkaz /bin/kill ... .

Odosielanie ďalších signálov je veľmi podobné, stačí podľa potreby aktuálny signál nahradiť signálmi TERM alebo KILL v príkazovom riadku.

Dôležité: Ukončovanie náhodného procesu v systém nie je dobrý nápad. V prípade procesu init(8) je identifikátor 1. Spustením /bin/kill -s KILL 1 môžeme veľmi rýchlo vypnúť systém. Vždy si pre istotu dvakrát skontrolujte parametere príkazu kill(1)slôr ako stlačíte Enter.

Poznámky

[1]

Nie je to celkom pravda – existuje niekoľko vecí, ktoré sa nedajú prerušiť. Napríklad ak sa proces pokúša čítať zo súboru, ktorý je na druhom počítači vsieti a keby druhý počítač z nejakých dôvodov vypadol (napríklad by bol vypnutý, alebo by zlyhala sieť), potom sa proces stane “neprerušiteľným”. Po vypršaní časového limitu, zvyčajne po dvoch minútach, sa proces ukončí.