Démonok, számítógépes nyilvántartások tól Z-ig
Démonok a Unix világban hagyományosan nevezik folyamatokat, amelyek nem lépnek közvetlen kapcsolatba a felhasználó. A démon folyamat nem a terminálra, és van, ennek megfelelően a felhasználói felület. A szabályozás a démonok, hogy más programokat. A név „démonok” merült fel annak a ténynek köszönhető, hogy sok a folyamatok ilyen típusú legtöbb időt vár néhány esemény. Amikor ez az esemény bekövetkezik, a démon aktív (ugrik, mint egy yo-the-box), teszi a dolgát, és visszamegy aludni várva eseményeket. Meg kell jegyezni, hogy számos, a démonok, mint például a web-szerver vagy adatbázis szerver lehet kiválasztani gyakorlatilag minden CPU időt, és más rendszer erőforrásait. Ezek a démonok több munkát, mint az alvás.
Most hagyjuk ki a blokkból, ha (argc> 1) a gazdasági szereplők (mi jön vissza később), és mérlegeli főbb állomásait a démont. BecomeDaemonProcess () függvény a megadott normál Linux konzolon folyamat egy démon folyamat. ConfigureSignalHandlers () függvény beállítja a jelkezelők démon folyamat, és BindPassiveSocket () függvény, hogy nyissa ki az egyes TCP / IP port hallgatni a bejövő kéréseket. Ezt követi egy ciklus, amelyben a szerver feldolgozza kéréseket. Sok hálózati szerverek, ha kéri, hozzon létre egy gyermek folyamatot kezelni azt. Így érhető el a lehetőséget párhuzamos lekérdezés feldolgozása. Néhány szervert használnak párhuzamos feldolgozási folyamatát a kéréseket. Ami a szerverre, az egyszerűség kedvéért, hogy kezeli a kérelmeket egy szekvenciális (blokkoló) módban. Nem várjuk el demókiszolgálóhoz kap egy csomó kéri, nem?
Normál kilépési keresett ciklusban történik SIGUSER1 jel fogadását. Való kilépés után a hurok folyamat okozza TidyUp () függvény és kilép. Mi lehet biztosan befejezni a démon küldött, hogy egy SIGKILL jelet (SIGTERM és mások), de a felhasználó jel SIGUSER1 gondoskodnak a barátságos demoga. „Udvarias befejezése” azt jelenti, hogy a szerver reagálni fog az aktuális kérés vége előtt, és távolítsa el a PId- fájlt.
Azt, hogy a gyökér könyvtárat az aktuális könyvtár a démon folyamat. Indítanak, a démon működhet akár a rendszer újraindítása, így a jelenlegi diretokriya kell tartoznia a fájlrendszer, amely nem lehet lecsatolni. Ezt követi a hívás lockFD = open (lockFileName, O_RDWR | O_CREAT | O_EXCL, 0644);
Minden démon folyamat létrehoz egy úgynevezett pid-állományt (vagy file lock). Ez a fájl általában a / var / run és a neve daemon.pid, ahol a „démon” a neve egy démon. Lock fájl tartalmazza a PID érték démon folyamatot. Ez a fájl két okból fontos. Először is, ez lehetővé teszi, hogy fennállásának megállapításához, hogy egy példány démon már fut a rendszerben. A legtöbb démont, beleértve a miénket, meg vypolnyayatsya legfeljebb egy példányt (ez logikus, tekintve, hogy a démonok gyakran fordulnak nonsharable források, mint például a hálózati portok). Befejeződött, a démon folyamat eltávolítja a pid-fájl, amely jelzi, hogy lehet kezdeni egy másik folyamat fokon. Azonban a démon nem mindig befejezi normálisan, majd a lemez egy nem létező folyamat pid-állományt. Ez úgy tűnik, hogy egy leküzdhetetlen akadályt indítsa újra a démont, de tényleg, a démonok sikeresen megbirkózni az ilyen helyzeteket. A folyamat elindítása a démon ellenőrzi a lemez pid-file egy megfelelő nevet. Ha egy ilyen fájl létezik, akkor kiolvassa démon PID értékét és a kill (2) ellenőrzi, hogy van egy folyamat a megadott PID rendszert. Ha a folyamat van, ez azt jelenti, hogy a felhasználó megpróbálja elindítani a démont újra. Ebben az esetben a program megjelenít egy üzenetet és kilép. Ha a folyamat a megadott PID van jelen, akkor pid-file tartozott CRASH démon. Ebben a helyzetben a program általában azt tanácsolja a felhasználónak, hogy távolítsa el a pid-állományt (felelősség ilyen esetekben mindig jobb átadni a felhasználó), és megpróbálja futtatni újra. Lehet, persze, az is, hogy a baleset után a démon marad a pid-file a lemezen, és akkor valami más folyamat megkapja ugyanazt a PID, hogy egy démon volt. Ebben a helyzetben ismét indul a daemon fog kinézni, mintha egy példánya már fut a rendszerben, és indítsa újra a démont nem lehet. Szerencsére, a leírt helyzet rendkívül valószínűtlen.
A második ok az, hogy a lock-file hasznosnak tartják, hogy ezzel a fájlt, akkor gyorsan kiderül a PID démon, anélkül, hogy a ps parancs.
Továbbá, a démon felhívja villa (3) függvény, amely létrehoz egy példányt belőle feldolgozni. A szülő folyamat véget, ahol:
Ez úgy történik, hogy a démon folyamat lekapcsolódott a központ terminál. Minden Unix terminál egy sor folyamat csoportok, az úgynevezett munkamenet. Bármely adott időpontban csak az egyik csoport folyamatok tartozó ülés van hozzáférése a terminál (azaz végezhet bemenet / kimenet a terminálon keresztül). Ezt a csoportot nevezzük az előtérben (prioritás). Minden alkalommal, van egy folyamat-alapítója az úgynevezett munkamenet vezetője. Ha a démon folyamat elindult a konzol, ez természetesen része lesz a kiemelt csoport tartozó eljárásokat a megfelelő terminális ülésén.
Annak érdekében, hogy húzza ki a terminál, a démon meg kell kezdeni egy új munkamenetet, nem jár semmilyen terminálon. Ahhoz, hogy démon új munkamenetet indítani, meg kell, hogy a vezető bármely más ülésen. Fork () hívás létrehoz egy gyermek folyamatot, ami nyilvánvalóan nem egy munkamenet vezetője. Ezután a gyermek folyamat kapjuk a fork (), új munkamenetet kezd meghívásával setsid funkció (2). A folyamat a vezetővé válás (és egyetlen tagja), egy új munkamenetet.
Tehát ezen a ponton van egy folyamat, amely nem kapcsolódik semmilyen terminálon. Továbbá, néhány irányelvek javasolják ok fork () ismét új eljárás már nem a vezető az új ülésszak (System V ülés vezetője automatikusan megkapják beléptető terminál bizonyos feltételek mellett). A Linux, hogy újra hívja fork () nem szükséges, és nem fogunk csinálni.
Érdemes megjegyezni, hogy ez most a démon egy új PID, akkor többé nem kell levelet démon pid-állományt. Mi rögzíti a PID értéket a fájl egy string (inkább, mint pid_t típusú változó). Ez úgy történik, mint a kényelem, hogy a PID értéke a pid-állományt lehet olvasni egy macska. Például:
A démon sikerült megtörni a kapcsolatot a terminál, ahonnan indult, de akkor is társulhat más folyamatok és fájlrendszerek fájlleírókkal örökölt a szülő folyamat. Annak érdekében, hogy megtörje ezt a kötést, és zárjon be minden nyitott fájlleírókkal mi folyamat:
Funkció sysconf () a paraméter _SC_OPEN_MAX visszaadja a lehető legnagyobb számú leírások amely meg tudja nyitni a programot. Felhívjuk a close () függvény az egyes leíró (függetlenül attól, hogy nyitva van-e vagy sem), kivéve a PId- leíró fájl, amely nyitottnak kell maradnia.
Működés közben a démon kezeli a standard bemeneti, kimeneti és hiba is nyitottnak kell lennie, mert szükség van számos olyan funkcióval rendelkezik, a standard könyvtár. Ugyanakkor ezek a deskpritory nem mutatott ki semmilyen valódi I / O patakok. Hogy oldja meg ezt a problémát, zárja be az első három leíró, majd újra nyissa meg őket, rámutatva, hogy a fájl neve / dev / null-ba:
Most már biztos, hogy a démon nem fog hozzáférni vezet semmilyen terminál. Azonban a démon lehetővé kell tenni, hogy levezetni, ahol az üzenetet a munkájukat. Hagyományosan erre a célra, a naplófájlok (log-fájlok). A naplófájlok a démon, mint a fekete doboz a síkok. Amikor a démon jött egy hiba, a felhasználó elemezni a log fájlt, és (némi szerencsével), hogy létrehozza a hiba okát. Semmi sem akadályozza meg démon megnyitni saját log fájlt, de ez nem túl kényelmes. A legtöbb démon syslog közüzemi szolgáltatásokat, ami folyóiratok számos rendszer eseményeket. Megnyitjuk a hozzáférést a magazin keresztül syslog openlog funkció (3):
Az első paraméter openlog () funkció - a adandó előtag az egyes rekordot a rendszer naplóban. Ezt követi a különböző syslog opciót. setlogmask (3) funkció lehetővé teszi, hogy hozzanak az üzenet prioritási szinteket, amelyek rögzítik a naplóban. Ha telefonál BecomeDaemonProcess () függvény, átadjuk a paraméter értékét loglevel LOG_DEBUG. Együtt a makro LOG_UPTO ez azt jelenti, hogy az összes prioritású üzenetet rögzítésre kerül a naplóban, kezdve a legmagasabb és a befejező LOG_DEBUG.
Az utolsó dolog, amit tennie kell, a „démonizálása” a folyamat - okoz setpgrp () függvény;
A hívás létrejön egy új eljárás, csoport azonosító, amely azonosítja az aktuális folyamat. Ebben a munkában BecomeDaemonProcess () függvény befejeződik, mivel most a folyamat egy igazi démon.
ConfigureSignalHandlers () függvény beállítja jelkezelők. A jeleket kap, hogy a démon, lehet három csoportba sorolhatók: figyelmen kívül hagyni, „végzetes” és feldolgozni. A funkció meghívásával jelet (SIGUSR2, SIG_IGN);
Handler funkció FatalSigHandler () ír az eseménynapló információt a vett jel, majd befejezi a folyamatot a függvény meghívásával előtt closelog () és TidyUp (), amely mentesít a lefoglalt erőforrások folyamat:
TermHandler () kezelő meghívja TidyUp () függvény, és befejezi a folyamatot. Handler Usr1Handler () teszi a rendszer log rekord az udvarias a folyamat végén, és hozzárendeli az érték gGracefulShutdown 1 (ami az eszébe jut, kilép a kérelem feldolgozását ciklus, amikor a ciklus készen áll rá). Processzor HupHandler () jel is tesz egy bejegyzést a rendszer naplóban, majd hozzárendeli a változó értéke 1 és gGracefulShutdown gCaughtHupSignal. A valós életben SIGHUP részesülő jelével a démon újraindul, ami kíséri újraolvasása a konfigurációs fájl (ami általában olvasni démon indítás során), és visszaállítása az értékeket benne tárolt paramétereket. Az igény, hogy olvassa el újra a konfigurációs fájl a leggyakoribb oka újraindítása démonokat. A démon konfigurációs fájl nem található, úgy, hogy a folyamat újraindítását teszi semmi különös.
Figyeljünk a változó típusa és gGracefulShutdown gCaughtHupSignal. Típusú sig_atomic_t nem találkoztunk. Az ezzel a típusú biztosítja, hogy olvasni és írni az adatokat a változók és gGracefulShutdown gCaughtHupSignal végrehajtandó atomi, a processzor utasítás, amely nem lehet megszakítani. Atomicity ha dolgozik, változók és gGracefulShutdown gCaughtHupSignal fontos potoumu hogy azokat egyszerre elérni és jelkezelőit a fő funkciója a program. Ugyanezen okból névvel illetjük ezeket a változókat kulcsszó ingadozó.
BindPassiveSocket () függvény megnyit egy portot a szerver (ebben az esetben, a kikötői 30.333) az összes rendelkezésre álló hálózati csatolók és visszaadja a megfelelő aljzat:
Aki olvassa el a cikk ebben a sorozatban, dedikált foglalatok világosnak kell lennie, hogy mi történik itt. Mi csak megemlíteni egy érdekes részlet. Ha az előző, már lezárt, az aljzat kapcsolódó ez a port a TIME_WAIT állapotban, a késleltetés egyenlő két időszakokban az élet szegmens (a késleltetés lehet, hogy akár két percig) léphet fel a záró a régi és a nyitó, az új foglalat. Ahhoz, hogy indítsa újra a démont, ha nem kell várni, az általunk használt setsockopt () paraméterrel SO_REUSEADDR.
AcceptConnections () függvény folyamatok kér egymás után, egy blokkoló hívás fogadni ():
Ez nem a legjobb módja viselkedik démon, de ha elkezdjük leírni a párhuzamos lekérdezés feldolgozása, a szerkesztők nem éli túl. Részben a folytatásra, együtt változó gGracefulShutdown azt határozza meg, hogy továbbra is kérések feldolgozásához program kell. Ha a következő hívás csatlakozni () vagy HandleConnection () olyan hibaüzenetet, ez a változó értéke 0 és a lekérdezés feldolgozása megszűnik. Az új foglalat, a kapott hívást fogadni (), továbbítjuk HandleConnection () függvényt.
HandleConnection () függvény beolvassa a húr által továbbított ügyfél, majd visszaküldi az ügyfélnek. Ezután AcceptConnections () függvény bezárja a kapcsolatot megnyitott egy hívást fogadni (). ReadLine () és WriteToSocket () triviális, és kezeli őket, nem fogunk. Ha valahol a láncban AcceptConnections hívások (), HandleConnection (), ReadLine () és WriteToSocket () hiba történik, a hiba információ kerül átadásra a lánc, amíg, amíg el nem éri a funkció main (). A main () függvény, ez az információ azonnali törlését eredményezheti a démon a megfelelő bejegyzéseket a rendszer üzeneteket.
Tekintsük végül TidyUp () függvény, amely hivatkozik a sok szerver funkciókat, mielőtt leállítani.
TidyUp funkció probléma () - „feküdt hulladéknak” démon folyamat. Tény, hogy nem ezt a funkciót, akkor megteheti befejezése után a rendszer bezárja valamennyi leírások, de a szabályok az etikett szükség explicit megjelenése források kifejezetten.
Ha fordítasz démon a parancs
Meg lehet kezdeni a démon csapat
Mivel a démon kell férnie a / var / run, futtatni kell a root. Közvetlenül azután, hogy a program megkezdése látni fogja a parancssor újra, hogy a démonok, az teljesen normális. Ha a szerver aahzd teljesítő valami hasznosat, az indítási parancs lenne regisztrálni a rendszer egyik indítószkriptekkel a /etc/init.d könyvtárban, de nem fogunk csinálni. Miután a szerver fut, akkor adja a parancsot
Ennek eredményeként létrejött a kapcsolat a szerverrel. Írja bármilyen karaktersor a telnet konzol, és nyomja meg az „Enter”. Erre válaszul a kiszolgáló egy nyomtatott sor és lezárja a kapcsolatot.
Térjünk most vissza a rajtvonalhoz a funkció main (). Bár nem tudjuk, hogy a PID a démon a pid-fájlt, és kezeli a démon a kill parancs, ez a lehetőség nem nevezhető nagyon kényelmes. Gyakran használják, hogy szabályozza a démon maga futtatható fájl démon fut speciális parancssori paramétereket. A démon megérti két parancsot: stop (leállítás a démon) és újraindítás (restart). Lássuk, hogyan kell viselkedni démon fut a parancssori paramétereket. Ebben az esetben a program elején a démon megpróbálja olvasni a PID értékét pid-állományt. Ha megnyitja a pid-fájl nem felel meg, akkor nagy valószínűséggel a démon nem fut, és a vezérlés egyszerűen semmi köze. Ha a PID értéket kapott, a folyamat démon démon ennek megfelelő jelet küld át kill () függvényt.
Démonok nem célja, hogy megtanítsa semmilyen adatot a felhasználó. Saját információt átadni más programok vagy rendszerben rögzített eseménynapló. A következő cikkben fogunk összpontosítani programok teljesen másképpen viselkedik, és megvizsgálja a konzol bemeneti és kimeneti.