Daemonit ovat prosesseja, jotka eivät toimi suoraan käyttäjän hallinnassa, vaan toimivat taustalla. Yleensä ne käynnistyvät järjestelmän käynnistyksen yhteydessä ja toimivat jatkuvasti, kunnes järjestelmä sammuu. Ainoa ero näiden ja normaalien prosessien välillä on, että ne eivät lähetä viestejä konsoliin tai näyttöön millään tavalla.

Näin voit luoda demonin Linux-koneeseen.

Lyhyt johdatus demonien luomiseen

Järjestelmässä toimii monia demoneja, ja joitain tuttuja demone-esimerkkejä ovat seuraavat:

  • crond: Suorittaa komennot määritettynä aikana
  • sshd: Mahdollistaa kirjautumisen järjestelmään etäkoneista
  • httpd: Palvelee web-sivuja
  • nfsd: Mahdollistaa tiedostojen jakamisen verkon kautta

Myös demoniprosessit nimetään yleensä kirjaimeen päättyväksi d, vaikka se ei ole pakollista.

Jotta prosessi toimisi demonina, seuraa seuraavaa polkua:

  • Alkutoimet, kuten määritystiedostojen lukeminen tai tarvittavien järjestelmäresurssien hankkiminen, on suoritettava ennen kuin prosessista tulee demoni. Näin järjestelmä voi raportoida vastaanotetuista virheistä käyttäjälle ja prosessi lopetetaan asianmukaisella virhekoodilla.
    instagram viewer
  • Taustalla käynnissä oleva prosessi luodaan siten, että init on sen pääprosessi. Tätä tarkoitusta varten aloitusprosessista haarautuu ensin aliprosessi, jonka jälkeen ylempi prosessi lopetetaan poistumalla.
  • Uusi istunto avautuu kutsumalla setsid-funktiota ja prosessi tulee katkaista päätteestä.
  • Kaikki ylätason prosessista perityt avoimet tiedostokuvaukset suljetaan.
  • Vakiotulo, lähtö, ja virheilmoitukset ohjataan osoitteeseen /dev/null.
  • Prosessin työhakemiston on muututtava.

Mitä ovat Daemon-istunnot?

Päätteen kautta järjestelmään kirjautuneena käyttäjät voivat ajaa useita sovelluksia shell-ohjelman kautta. Näiden prosessien pitäisi sulkeutua, kun käyttäjä poistuu järjestelmästä. Käyttöjärjestelmä ryhmittelee nämä prosessit istunto- ja prosessiryhmiin.

Jokainen istunto koostuu prosessiryhmistä. Voit kuvata tätä tilannetta seuraavasti:

Päätelaitetta, jossa prosessit vastaanottavat tulonsa ja lähettävät ulostulonsa, kutsutaan ohjauspäätteeksi. Ohjaava päätelaite liittyy vain yhteen istuntoon kerrallaan.

Istunnolla ja siinä olevilla prosessiryhmillä on tunnusnumerot (ID); nämä tunnistenumerot ovat istunnon ja prosessiryhmän johtajien prosessin tunnistenumeroita (PID). Aliprosessi jakaa saman ryhmän kuin sen pääprosessi. Kun prosesseja on useita kommunikoida putkimekanismin kanssa, ensimmäisestä prosessista tulee prosessiryhmän johtaja.

Daemon-prosessin luominen Linuxissa

Täältä näet kuinka voit luoda demonifunktion. Tätä tarkoitusta varten luot funktion nimeltä _daemon. Voit aloittaa nimeämällä demonina toimivan sovelluskoodin nimellä testi.c, ja koodi, jolla luot demonifunktion daemon.c.

//test.c
#sisältää <stdio.h>
int_daemon(int, int);
intpää()
{
getchar();
_daemon (0, 0);
getchar();
palata0;
}
//daemon.c
#sisältää <sys/types.h>
#sisältää <sys/stat.h>
#sisältää <stdlib.h>
#sisältää <stdio.h>
#sisältää <fcntl.h>
#sisältää <unistd.h>
#sisältää <linux/fs.h>
#sisältää <linux/limits.h>
int_daemon(int nochdir, int noclose){
pid_t pid;
pid = haarukka(); // Katkaise emoprosessi
jos (pid < 0) {
poistu(EXIT_FAILURE);
}
jos (pid > 0) {
poistu(EXIT_SUCCESS);
}
palata0;
}

Demonin luomiseen tarvitaan taustaprosessi, jonka pääprosessi on init. Yllä olevassa koodissa _daemon luo aliprosessin ja tappaa sitten emoprosessin. Tässä tapauksessa uusi prosessisi on init-prosessin aliprosessi ja jatkuu taustalla.

Käännä nyt sovellus seuraavalla komennolla ja tutki prosessin tilaa ennen ja jälkeen _deamon kutsutaan:

gcc-otestatatestata.cdemoni.c

Suorita sovellus ja vaihda toiseen päätteeseen painamatta muita näppäimiä:

./testata

Näet, että prosessiisi liittyvät arvot ovat seuraavat. Tässä sinun on käytettävä ps-komento saadaksesi prosessiin liittyviä tietoja. Tässä tapauksessa _daemon toimintoa ei ole vielä kutsuttu.

ps -C testata -o "pid ppid pgid sid tty statkomento"
# Lähtö
PID PPID PGID SID TT STAT KOMENTO
10296 5119 10296 5117 pts/2 S+ ./testata

Kun katsot STAT -kentässä näet, että prosessisi on käynnissä, mutta odottaa aikataulun ulkopuolista tapahtumaa, joka saa sen ajamaan etualalla.

Lyhenne Merkitys
S Odottaa unessa tapahtuman tapahtumista
T Sovellus pysäytetty
s Istunnon johtaja
+ Sovellus on käynnissä etualalla

Näet, että hakemuksesi pääprosessi on odotetusti kuori.

ps - jp 5119 
# Lähtö
PID PGID SID TTY AIKA CMD
5119 5119 5117 pts/2 00:00:02 zsh

Palaa nyt terminaaliin, jossa käytät sovellusta, ja paina Tulla sisään kutsua _daemon toiminto. Katso sitten toisen päätteen prosessitietoja uudelleen.

ps -C testata -o "pid ppid pgid sid tty statkomento"
# Lähtö
PID PPID PGID SID TT STAT KOMENTO
22504 1 22481 5117 pts/2 S ./testata

Ensinnäkin voit sanoa, että uusi aliprosessi on käynnissä taustalla, koska et näe + hahmo STAT ala. Tutki nyt, kuka on prosessin pääprosessi käyttämällä seuraavaa komentoa:

ps - jp 1 
​​​​​​​# Lähtö
PID PGID SID TTY AIKA CMD
1 1 1? 00:00:01systemd

Voit nyt nähdä, että prosessisi pääprosessi on systemd prosessi. Yllä on mainittu, että seuraavaa vaihetta varten uuden istunnon pitäisi avautua ja prosessi katkaistaan ​​ohjauspäätteestä. Tätä varten käytät setsid-funktiota. Lisää tämä puhelu omaan _daemon toiminto.

Lisättävä koodinpätkä on seuraava:

jos (setsid() == -1) 
palata-1;

Nyt kun olet tarkastanut valtion aiemmin _daemon kutsutaan nyt, voit poistaa ensimmäisen getchar toimintoa testi.c koodi.

//test.c
#sisältää <stdio.h>
int_daemon(int, int);
intpää()
{
_daemon (0, 0);
getchar();
palata0;
}

Kun olet kääntänyt ja suorittanut sovelluksen uudelleen, siirry päätteeseen, jossa teit arvostelusi. Prosessi uusi tila on seuraava:

ps -C testata -o "pid ppid pgid sid tty statkomento"
​​​​​​​# Lähtö
PID PPID PGID SID TT STAT KOMENTO
25494 1 25494 25494? Ss./testata

The ? kirjaudu sisään TT -kenttä osoittaa, että prosessisi ei ole enää yhteydessä päätteeseen. Huomaa, että PID, PGID, ja SID prosessisi arvot ovat samat. Prosessi on nyt istunnon johtaja.

Muuta seuraavassa vaiheessa työhakemisto juurihakemistoksi välittämäsi argumentin arvon mukaan. Voit lisätä seuraavan katkelman _daemon toiminto tähän:

if (!nochdir) {
jos (chdir("/") == -1)
palata-1;
}

Nyt hyväksytyn argumentin mukaan kaikki tiedostokuvaajat voidaan sulkea. Lisää seuraava koodi _daemon toiminto:

#define NR_OPEN 1024
if (!noclose) {
for (i = 0; i < NR_OPEN; i++)
sulkea (i);
avata("/dev/tyhjä", O_RDWR);
dup (0);
dup (0);
}

Kun kaikki tiedostokuvaajat on suljettu, daemonin avaamat uudet tiedostot näytetään kuvaajilla 0, 1 ja 2. Tässä tapauksessa esimerkiksi printf koodin komennot ohjataan toiseen avautuvaan tiedostoon. Tämän välttämiseksi kolme ensimmäistä tunnistetta osoittavat /dev/null laite.

Tässä tapauksessa lopullinen tila _daemon toiminto tulee olemaan seuraava:

#sisältää <sys/types.h>
#sisältää <sys/stat.h>
#sisältää <stdio.h>
#sisältää <stdlib.h>
#sisältää <fcntl.h>
#sisältää <errno.h>
#sisältää <unistd.h>
#sisältää <syslog.h>
#sisältää <merkkijono.h>
int_daemon(mitätön){
// PID: Prosessin tunnus
// SID: istunnon tunnus
pid_t pid, sid;
pid = haarukka(); // Katkaise emoprosessi
jos (pid < 0) {
poistu(EXIT_FAILURE);
}
jos (pid > 0) {
poistu(EXIT_SUCCESS);
}
// Luoda a SIDvartenlapsi
sid = setsid();
jos (sid < 0) {
// Epäonnistui
poistu(EXIT_FAILURE);
}
if ((chdir("/")) < 0) {
// Epäonnistui
poistu(EXIT_FAILURE);
}
sulje (STDIN_FILENO);
sulje (STDOUT_FILENO);
sulje (STDERR_FILENO);
sillä aikaa (1) {
// Jotkut tehtävät
nukkua (30);
}
poistu(EXIT_SUCCESS);
}

Tässä on esimerkki koodinpätkästä, joka suorittaa sshd sovellus a demoni:

...
if (!(debug_flag || inetd_flag || no_daemon_flag)) {
int fd;
jos (daemon (0, 0) < 0)
kohtalokas ("daemon() epäonnistui: %.200s", strerror (errno));
/* Katkaise yhteys ohjaavaan tty: hen. */
fd = avoin (_PATH_TTY, O_RDWR | O_NOCTTY);
jos (fd >= 0) {
(mitätön) ioctl (fd, TIOCNOTTY, NULL);
sulkea (fd);
}
}
...

Daemonit ovat tärkeitä Linux-järjestelmäohjelmoinnissa

Daemonit ovat ohjelmia, jotka suorittavat erilaisia ​​toimintoja ennalta määritetyllä tavalla, joka on asetettu vasteena tiettyihin tapahtumiin. Ne toimivat äänettömästi Linux-koneellasi. Ne eivät ole käyttäjän suorassa hallinnassa ja jokaisella taustalla toimivalla palvelulla on oma demoninsa.

On tärkeää hallita demonit, jotta voit oppia Linux-käyttöjärjestelmän ydinrakenteen ja ymmärtää eri järjestelmäarkkitehtuurien toimintaa.

Mikä on Daemon?

Lue Seuraava

JaaTweetJaaSähköposti

Liittyvät aiheet

  • Linux
  • Linux-ydin
  • Ohjelmointi
  • C Ohjelmointi

Kirjailijasta

Fatih Küçükkarakurt (5 artikkelia julkaistu)

Insinööri ja ohjelmistokehittäjä, joka on matematiikan ja tekniikan fani. Hän on aina pitänyt tietokoneista, matematiikasta ja fysiikasta. Hän on kehittänyt pelimoottoriprojekteja sekä koneoppimista, keinotekoisia hermoverkkoja ja lineaarisia algebrakirjastoja. Lisäksi työskentelee edelleen koneoppimisen ja lineaaristen matriisien parissa.

Lisää Fatih Küçükkarakurtilta

tilaa uutiskirjeemme

Liity uutiskirjeemme saadaksesi teknisiä vinkkejä, arvosteluja, ilmaisia ​​e-kirjoja ja eksklusiivisia tarjouksia!

Klikkaa tästä tilataksesi