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:


```c
#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