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]