Dæmoner er processer, der ikke kører direkte under brugerens kontrol, men tjener i baggrunden. Normalt starter de ved systemstart og kører kontinuerligt, indtil systemet lukker ned. Den eneste forskel mellem disse og normale processer er, at de ikke sender beskeder til konsollen eller skærmen på nogen måde.
Her er hvordan du kan oprette en dæmon på en Linux-maskine.
En kort introduktion til, hvordan dæmoner skabes
En masse dæmoner kører på systemet, og nogle velkendte dæmoner er som følger:
- crond: Får kommandoer til at køre på det angivne tidspunkt
- sshd: Tillader login til systemet fra eksterne maskiner
- httpd: Betjener websider
- nfsd: Tillader fildeling over netværket
Også dæmonprocesser er normalt navngivet til at slutte med bogstavet d, selvom det ikke er obligatorisk.
For at en proces skal køre som en dæmon, følges følgende sti:
- Indledende handlinger, såsom læsning af konfigurationsfiler eller indhentning af nødvendige systemressourcer, skal udføres, før processen bliver en dæmon. På denne måde kan systemet rapportere de modtagne fejl til brugeren, og processen vil blive afsluttet med en passende fejlkode.
- En kørende baggrundsproces oprettes med init som sin overordnede proces. Til dette formål forgrenes en underproces først fra init-processen, og derefter afsluttes den øvre proces med exit.
- En ny session bør åbnes ved at kalde setsid-funktionen, og processen bør afbrydes fra terminalen.
- Alle åbne filbeskrivelser, der er arvet fra den overordnede proces, lukkes.
- Standard input, output, og fejlmeddelelser omdirigeres til /dev/null.
- Processens arbejdsmappe skal ændres.
Hvad er Daemon-sessioner?
Efter at have logget ind på systemet via en terminal, kan brugere køre mange applikationer gennem shell-programmet. Disse processer bør lukke, når brugeren forlader systemet. Operativsystemet grupperer disse processer i sessions- og procesgrupper.
Hver session består af procesgrupper. Du kan beskrive denne situation som følger:
Terminalen, hvor processerne modtager deres input og sender deres output, kaldes den kontrollerende terminal. En kontrollerende terminal er kun knyttet til én session ad gangen.
En session og procesgrupperne i den har identifikations (ID) numre; disse identifikationsnumre er procesidentifikationsnumrene (PID) for sessions- og procesgruppelederne. En underordnet proces deler den samme gruppe som sin overordnede proces. Når flere processer er kommunikerer med rørmekanismen, bliver den første proces procesgruppeleder.
Oprettelse af en Daemon-proces på Linux
Her vil du se, hvordan du kan oprette en dæmonfunktion. Til dette formål vil du oprette en funktion med navnet _dæmon. Du kan starte med at navngive applikationskoden, der kører som en dæmon som test.c, og koden som du vil oprette dæmonfunktionen som daemon.c.
//test.c
#omfatte <stdio.h>
int_dæmon(int, int);
intvigtigste()
{
getchar();
_dæmon (0, 0);
getchar();
Vend tilbage0;
}
//daemon.c
#omfatte <sys/types.h>
#omfatte <sys/stat.h>
#omfatte <stdlib.h>
#omfatte <stdio.h>
#omfatte <fcntl.h>
#omfatte <unistd.h>
#omfatte <linux/fs.h>
#omfatte <linux/limits.h>
int_dæmon(int nochdir, int noclose){
pid_t pid;
pid = gaffel(); // Afbryd forældreprocessen
hvis (pid < 0) {
Afslut(EXIT_FAILURE);
}
hvis (pid > 0) {
Afslut(EXIT_SUCCESS);
}
Vend tilbage0;
}
For at oprette en dæmon skal du bruge en baggrundsproces, hvis overordnede proces er igangsat. I koden ovenfor, _dæmon skaber en underordnet proces og dræber derefter forældreprocessen. I dette tilfælde vil din nye proces være en underproces af init og vil fortsætte med at køre i baggrunden.
Kompiler nu applikationen med følgende kommando og undersøg status for processen før og efter _dæmon Hedder:
gcc-oprøveprøve.cdæmon.c
Kør applikationen og skift til en anden terminal uden at trykke på andre taster:
./prøve
Du kan se, at værdierne relateret til din proces er som følger. Her skal du bruge ps-kommandoen for at få procesrelateret information. I dette tilfælde _dæmon funktion er ikke blevet kaldt endnu.
ps -C prøve -o "pid ppid pgid sid tty statkommando"
# Output
PID PPID PGID SID TT STAT KOMMANDO
10296 5119 10296 5117 pts/2 S+ ./prøve
Når man ser på STAT felt, kan du se, at din proces kører, men venter på, at der opstår en hændelse uden for tidsplanen, som vil få den til at køre i forgrunden.
Forkortelse | Betyder |
S | Venter sovende på, at en begivenhed sker |
T | Ansøgning stoppet |
s | Sessionsleder |
+ | Applikationen kører i forgrunden |
Du kan se, at forældreprocessen for din ansøgning er skallen som forventet.
ps -jp 5119
# Output
PID PGID SID TTY TID CMD
5119 5119 5117 pts/2 00:00:02 zsh
Vend nu tilbage til terminalen, hvor du kører din applikation, og tryk Gå ind at påberåbe sig _dæmon fungere. Se derefter procesinformationen på den anden terminal igen.
ps -C prøve -o "pid ppid pgid sid tty statkommando"
# Output
PID PPID PGID SID TT STAT KOMMANDO
22504 1 22481 5117 pts/2 S ./prøve
Først og fremmest kan du sige, at den nye underproces kører i baggrunden, da du ikke kan se + karakter i STAT Mark. Undersøg nu, hvem der er forælderprocessen for processen ved hjælp af følgende kommando:
ps -jp 1
# Output
PID PGID SID TTY TID CMD
1 1 1? 00:00:01systemd
Du kan nu se, at forældreprocessen i din proces er systemd behandle. Det er nævnt ovenfor, at til næste trin skal en ny session åbne, og processen skal afbrydes fra kontrolterminalen. Til dette bruger du setsid-funktionen. Tilføj dette opkald til din _dæmon fungere.
Kodestykket, der skal tilføjes, er som følger:
if (setsid() == -1)
Vend tilbage-1;
Nu hvor du har inspiceret staten før _dæmon kaldet, kan du nu fjerne den første getchar funktion i test.c kode.
//test.c
#omfatte <stdio.h>
int_dæmon(int, int);
intvigtigste()
{
_dæmon (0, 0);
getchar();
Vend tilbage0;
}
Når du har kompileret og kørt programmet igen, skal du gå til terminalen, hvor du lavede dine anmeldelser. Den nye status for din proces er som følger:
ps -C prøve -o "pid ppid pgid sid tty statkommando"
# Output
PID PPID PGID SID TT STAT KOMMANDO
25494 1 25494 25494? Ss./prøve
Det ? tilmelde dig TT feltet angiver, at din proces ikke længere er forbundet til en terminal. Bemærk, at PID, PGID, og SID værdierne i din proces er de samme. Din proces er nu en sessionsleder.
I det næste trin skal du ændre arbejdsmappen til rodmappen i henhold til værdien af det argument, du sendte. Du kan tilføje følgende uddrag til _dæmon funktion til dette:
if (!nochdir) {
hvis (chdir("/") == -1)
Vend tilbage-1;
}
Nu kan alle filbeskrivelser lukkes ifølge argumentet. Tilføj følgende kode til _dæmon fungere:
#define NR_OPEN 1024
if (!noclose) {
for (i = 0; jeg < NR_OPEN; i++)
lukke (i);
åben("/dev/nul", O_RDWR);
dup (0);
dup (0);
}
Efter at alle filbeskrivelser er lukket, vil nye filer åbnet af daemon blive vist med deskriptorerne 0, 1 og 2 henholdsvis. I dette tilfælde er f.eks printf kommandoer i koden vil blive dirigeret til den anden åbnede fil. For at undgå dette peger de første tre identifikatorer på /dev/null enhed.
I dette tilfælde er den endelige tilstand af _dæmon funktion vil være som følger:
#omfatte <sys/types.h>
#omfatte <sys/stat.h>
#omfatte <stdio.h>
#omfatte <stdlib.h>
#omfatte <fcntl.h>
#omfatte <errno.h>
#omfatte <unistd.h>
#omfatte <syslog.h>
#omfatte <streng.h>
int_dæmon(ugyldig){
// PID: Proces ID
// SID: Sessions-id
pid_t pid, sid;
pid = gaffel(); // Afbryd forældreprocessen
hvis (pid < 0) {
Afslut(EXIT_FAILURE);
}
hvis (pid > 0) {
Afslut(EXIT_SUCCESS);
}
// skab -en SIDtilbarn
sid = setsid();
hvis (sid < 0) {
// FAIL
Afslut(EXIT_FAILURE);
}
hvis ((chdir("/")) < 0) {
// FAIL
Afslut(EXIT_FAILURE);
}
luk (STDIN_FILENO);
luk (STDOUT_FILENO);
luk (STDERR_FILENO);
mens (1) {
// Nogle opgaver
søvn (30);
}
Afslut(EXIT_SUCCESS);
}
Her er et eksempel på et kodestykke, der kører sshd ansøgning som en dæmon:
...
if (!(debug_flag || inetd_flag || no_daemon_flag)) {
int fd;
if (dæmon (0, 0) < 0)
fatal("daemon() mislykkedes: %.200s", strerror (fejl));
/* Afbryd forbindelsen til den kontrollerende tty. */
fd = åben (_PATH_TTY, O_RDWR | O_NOCTTY);
hvis (fd >= 0) {
(ugyldig) ioctl (fd, TIOCNOTTY, NULL);
lukke (fd);
}
}
...
Dæmoner er vigtige for Linux-systemprogrammering
Dæmoner er programmer, der udfører forskellige handlinger på en foruddefineret måde indstillet som reaktion på bestemte hændelser. De kører lydløst på din Linux-maskine. De er ikke under brugerens direkte kontrol, og hver tjeneste, der kører i baggrunden, har sin dæmon.
Det er vigtigt at mestre dæmoner for at lære kernestrukturen af Linux-operativsystemet og for at forstå, hvordan forskellige systemarkitekturer fungerer.
Hvad er en dæmon?
Læs Næste
Relaterede emner
- Linux
- Linux-kerne
- Programmering
- C programmering
Om forfatteren
En ingeniør og softwareudvikler, der er fan af matematik og teknologi. Han har altid godt kunne lide computere, matematik og fysik. Han har udviklet spilmotorprojekter samt maskinlæring, kunstige neurale netværk og lineære algebrabiblioteker. Arbejder desuden med maskinlæring og lineære matricer.
Abonner på vores nyhedsbrev
Tilmeld dig vores nyhedsbrev for tekniske tips, anmeldelser, gratis e-bøger og eksklusive tilbud!
Klik her for at abonnere