Daemon

Daemon (palveluprosessi) on Unixissa ja Unixin kaltaisissa käyttöjärjestelmissä taustalla suoritettava järjestelmäohjelma, jota käyttäjä ei suoraan hallitse. 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. Daemonit suoritetaan taustalla koska niillä ei ole ohjaavaa päätettä. Koska daemoneilla ei ole ohjaavaa päätettä virheviestien käsittely tapahtuu normaalisti järjestelmälokin avulla.

Daemonien toteutuksessa on eroja tehdäänkö se perinteisellä System V -tavalla vai uudella Linuxissa käytetyllä tavalla. Myös Mac OS X:ssä on eroja perinteiseen System V -tapaan verrattuna. Uudet ratkaisut kuten systemd ja launchd tukevat käyttäjäkohtaisien daemonien käynnistämistä (user units, user agents).

Minimalistinen daemon-ohjelma:

#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). Käynnistyessään se on kuten mikä tahansa suoritettava ohjelma järjestelmässä, mutta autonomiseksi sen tekee lapsiprosessin käynnistäminen fork()-kutsulla. Lapsiprosessin käynnistämisen jälkeen isäntäprosessi voi poistua ja ohjelma jatkaa suoritusta.

Tiedostomaski asetetaan umask()-kutsulla, jolla merkitään pääsy daemonin luomiin tiedostoihin.

Istuntotunniste lapsiprosessille asetetaan setsid()-kutsulla.

Työhakemisto vaihdetaan juurihakemistoon, joka on taattu olemassa olevaksi ja muut hakemistot voivat poistua mikäli levy otetaan pois käytöstä.

Lisäksi tietyt tiedostokahvat suljetaan koska daemonilla ilman ohjaavaa päätettä ei ole niille käyttöä.

Etymologia 

Daemon-nimen keksivät MIT:n Project MAC -ohjelmoijat vuonna 1963. He ottivat nimen Maxwellin demonilta, joka on fyysikko James Clerk Maxwellin esittämässä ajatuskokeessa taustalla herkeämättä molekyylejä lajitteleva pieni olento.

Myöhemmin "daemon" on väärin siteerattu retronyymiksi engl. sanoista Disk And Execution MONitor, ’levy- ja suoritusvalvoja’.

Daemonien vastine Windowsissa 

Microsoft Windows -järjestelmissä vastaavankaltaisia ohjelmia kutsutaan palveluiksi ().

Katso myös 

 Palvelin

Lähteet 

Unix