Daemon
Daemon (palveluprosessi) on Unixissa ja Unixin kaltaisissa käyttöjärjestelmissä taustalla suoritettava järjestelmäohjelma, jota käyttäjä ei suoraan hallitse.[1] Myös muissa moniajoa tukevissa käyttöjärjestelmissä on vastaava käsite. Käyttöjärjestelmä käynnistää daemonit käynnistyessään (usein, mutta ei aina, ne käynnistää init) ja niiden tehtävänä on esimerkiksi vastata verkosta tuleviin palvelupyyntöihin (WWW-palvelin-daemon, SSH-palvelin-daemon), hoitaa tulostustöitä tai käynnistää ajastettuja tehtäviä, kuten varmuuskopioinnin.
Tyypillisesti daemonien nimi päättyy d-kirjaimeen: syslogd
huolehtii järjestelmälokista, sshd
saapuvista SSH-yhteyksistä ja crond
ajastetuista tehtävistä.
Unix-daemon
Daemonit ovat prosesseja, jotka elävät pitkän aikaa: ne yleensä käynnistetään järjestelmän käynnistyessä ja sammutetaan järjestelmän sammutuksessa.[2] Daemonit suoritetaan taustalla koska niillä ei ole ohjaavaa päätettä.[2] Koska daemoneilla ei ole ohjaavaa päätettä virheviestien käsittely tapahtuu normaalisti järjestelmälokin avulla.[2]
Daemonien toteutuksessa on eroja tehdäänkö se perinteisellä System V -tavalla vai uudella Linuxissa käytetyllä tavalla.[3] Myös Mac OS X:ssä on eroja perinteiseen System V -tapaan verrattuna.[3][4] Uudet ratkaisut kuten systemd ja launchd tukevat käyttäjäkohtaisien daemonien käynnistämistä (user units, user agents).[5][4]
Minimalistinen daemon-ohjelma[2][6]:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void)
{
pid_t pid, sid;
pid = fork();
if (pid < 0)
exit(EXIT_FAILURE); /* lapsiprosessin luonti epäonnistui */
if (pid > 0)
exit(EXIT_SUCCESS); /* isäntäprosessi poistuu */
umask(0); /* tiedosto-oikeudet */
sid = setsid();
if (sid < 0)
exit(EXIT_FAILURE);
if (chdir("/") < 0)
exit(EXIT_FAILURE);
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
/* tee jotain daemonissa */
while (1)
sleep(10);
return (0);
}
Daemonin voi käynnistää järjestelmä käynnistyessään, käyttäjä päätteellä tai komentokieliohjelma (skripti).[6] Käynnistyessään se on kuten mikä tahansa suoritettava ohjelma järjestelmässä, mutta autonomiseksi sen tekee lapsiprosessin käynnistäminen fork()
-kutsulla.[6] Lapsiprosessin käynnistämisen jälkeen isäntäprosessi voi poistua ja ohjelma jatkaa suoritusta.[6]
Tiedostomaski asetetaan umask()
-kutsulla, jolla merkitään pääsy daemonin luomiin tiedostoihin.[6]
Istuntotunniste lapsiprosessille asetetaan setsid()
-kutsulla.[6]
Työhakemisto vaihdetaan juurihakemistoon, joka on taattu olemassa olevaksi ja muut hakemistot voivat poistua mikäli levy otetaan pois käytöstä.[6]
Lisäksi tietyt tiedostokahvat suljetaan koska daemonilla ilman ohjaavaa päätettä ei ole niille käyttöä.[6]
Etymologia
Daemon-nimen keksivät MIT:n Project MAC -ohjelmoijat vuonna 1963.[1] He ottivat nimen Maxwellin demonilta, joka on fyysikko James Clerk Maxwellin esittämässä ajatuskokeessa taustalla herkeämättä molekyylejä lajitteleva pieni olento.[7]
Myöhemmin "daemon" on väärin siteerattu retronyymiksi engl. sanoista Disk And Execution MONitor, ’levy- ja suoritusvalvoja’.[8]
Daemonien vastine Windowsissa
Microsoft Windows -järjestelmissä vastaavankaltaisia ohjelmia kutsutaan palveluiksi (engl. services).[1]
Katso myös
Lähteet
- Daemon Definition linfo.org. Viitattu 7.9.2021. (englanniksi)
- Stevens, W. Richard: Advanced Programming in the UNIX Environment, s. 415–425. Addison-Wesley, 1993. ISBN 0201563177. (englanniksi)
- daemon(7) man7.org. Viitattu 7.9.2021. (englanniksi)
- Creating Launch Daemons and Agents developer.apple.com. Viitattu 7.9.2021. (englanniksi)
- systemd/User wiki.archlinux.org. Viitattu 12.9.2021. (englanniksi)
- Devin Watson: Linux Daemon Writing HOWTO netzmafia.de. toukokuu 2004. Viitattu 7.9.2021. (englanniksi)
- Fernando J. Corbató: Take Our Word for It takeourword.com. 23.1.2002. Viitattu 20.8.2006.
- Eric S. Raymond. "daemon" catb.org.