Il termine daemon deriva dalla mitologia greca antica, dove indicava un essere immateriale che influenzava il mondo umano.
In informatica, soprattutto nei sistemi operativi di tipo UNIX, un daemon è un processo in background che si esegue senza interazione diretta con l’utente. Non dipende da un terminale o da un’interfaccia grafica e in genere viene avviato all’avvio del sistema o in determinate condizioni.
La funzione principale di un daemon è fornire servizi specifici ad altri processi o utenti. Ad esempio, un daemon può restare in ascolto su porte di rete in attesa di connessioni, monitorare eventi di sistema e rispondere quando vengono soddisfatte determinate condizioni, gestire attività pianificate (come cron), inviare e-mail (sendmail) e molto altro.
In Windows, l’equivalente più vicino a un daemon è un servizio (Service). La differenza principale risiede nel modo in cui vengono avviati, registrati, gestiti e configurati all’interno del sistema operativo. Tuttavia, lo scopo è lo stesso: garantire il funzionamento continuo in background di determinate funzioni o servizi.
Esecuzione in background: gli utenti di solito non vedono un’interfaccia del daemon; non scrive sull’output standard (o lo reindirizza ai log) e non richiede input da tastiera.
Autonomo: un daemon viene avviato all’avvio del sistema, quando viene richiamato da un sistema di init (come systemd), oppure manualmente dall’utente (tramite script, cron, ecc.).
Lunga durata: idealmente un daemon viene eseguito indefinitamente, a meno che non si verifichi un errore critico o riceva un segnale di arresto esplicito.
Isolato: di solito viene eseguito sotto un account utente o gruppo separato per ridurre i privilegi, rendendo i servizi più sicuri e facili da gestire.
Logging: invece di utilizzare input/output standard, i daemon registrano le informazioni in file di log o nel logger di sistema (journald, syslog, ecc.), utile per il debug e la diagnostica.
Storicamente, quasi tutte le attività di sistema in background in Linux sono implementate come daemon. Il sistema operativo ne include decine, ciascuno con una funzione specifica. Ecco alcuni esempi:
sshd (Secure Shell Daemon): resta in ascolto sulla porta 22 (per impostazione predefinita) e consente agli utenti remoti di connettersi tramite SSH crittografato. Senza sshd, l’accesso remoto al terminale sarebbe quasi impossibile.
cron: un daemon di pianificazione dei lavori. Controlla le voci del crontab ed esegue script o comandi secondo una pianificazione, come la pulizia dei log, l’invio di report o i controlli di sistema.
syslogd / rsyslog / journald: daemon di registrazione del sistema che raccolgono messaggi dal kernel, dalle utility, da altri daemon e applicazioni, e li salvano nei file di log o nel journal.
NetworkManager o Wicd: daemon che gestiscono le impostazioni di rete — automatizzano connessioni a reti cablate/wireless, switch, configurazioni VPN e altro.
Questi daemon vengono avviati all’avvio del sistema e registrati nel gestore dei servizi (ad esempio systemd). Restano in esecuzione fino allo spegnimento o riavvio del sistema. Gli utenti interagiscono con essi indirettamente — tramite file di configurazione, comandi da terminale (service, systemctl) o richieste di rete (se il daemon fornisce un’interfaccia HTTP/S, SSH o simile).
Per implementare un daemon, segui questi passaggi:
Creazione del processo (fork): il processo padre chiama fork() e continua l’esecuzione del codice del daemon nel processo figlio.
Scollegamento dal terminale di controllo (setsid): per evitare interferenze dell’utente (ad esempio la chiusura del terminale), il daemon chiama setsid() per avviare una nuova sessione e diventarne il leader.
Chiusura dei descrittori di input/output standard: poiché il daemon non deve scrivere sullo schermo o attendere input, stdin, stdout e stderr vengono chiusi o reindirizzati ai file di log.
Gestione dei segnali e logging: per supportare uno spegnimento pulito o il ricaricamento della configurazione, il daemon deve gestire i segnali (SIGTERM, SIGHUP, ecc.). La registrazione viene generalmente effettuata tramite syslog o file.
Ciclo principale: dopo l’inizializzazione, il daemon entra nel ciclo principale: attende eventi, li gestisce e ripete finché non viene interrotto.
Vediamo come creare un daemon su Ubuntu 22.04 utilizzando un server cloud Hostman.
Crea un file chiamato mydaemon.c e inserisci il seguente codice:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <syslog.h>
int main() {
// Aprire syslog
openlog("mydaemon", LOG_PID, LOG_DAEMON);
syslog(LOG_NOTICE, "Daemon started");
// Ciclo infinito principale
while (1) {
// Attività in background: monitoraggio, gestione code, ecc.
syslog(LOG_NOTICE, "Performing task...");
sleep(60);
}
// Se il ciclo termina
syslog(LOG_NOTICE, "Daemon stopped");
closelog();
return 0;
}
Aggiorna prima i pacchetti:
sudo apt update && sudo apt upgrade
Installa il compilatore GCC se non è già installato:
sudo apt install gcc
Compila il daemon:
gcc mydaemon.c -o mydaemon
Sposta il file binario in /usr/local/bin/, una posizione standard per le utility personalizzate:
mv mydaemon /usr/local/bin/mydaemon
Crea un file di unità chiamato mydaemon.service:
sudo nano /etc/systemd/system/mydaemon.service
Inserisci il seguente contenuto:
[Unit]
Description=My Daemon
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mydaemon
Restart=on-failure
[Install]
WantedBy=multi-user.target
Spiegazione dei campi:
Description: descrizione mostrata in systemctl status.After=network.target: assicura che il daemon si avvii dopo che la rete è attiva.Type=simple: il daemon non crea sottoprocessi, si esegue come un unico processo.ExecStart: percorso all’eseguibile del daemon.Restart=on-failure: riavvio automatico in caso di errore del daemon.WantedBy=multi-user.target: fa partire il servizio nell’ambiente multiutente standard.sudo systemctl daemon-reload # Ricaricare la configurazione di systemd
sudo systemctl start mydaemon # Avviare il daemon
sudo systemctl status mydaemon # Verificare lo stato
Se tutto funziona, lo stato mostrerà active. Per visualizzare i log:
journalctl -u mydaemon.service -e
Il loro compito è restare in ascolto su una porta di rete (di solito 80 o 443), accettare richieste HTTP/HTTPS, generare una risposta (una pagina HTML, dati JSON, ecc.) e restituire il risultato al client. Nella maggior parte dei casi, un server web si avvia con il sistema e rimane in esecuzione fino allo spegnimento o a un comando di stop (es. systemctl stop nginx).
MySQL/MariaDB, PostgreSQL, MongoDB — tutti questi sono daemon. Si avviano con il sistema e continuano a funzionare in background, accettando richieste da applicazioni client o servizi web. Questi daemon registrano l’attività, supportano la configurazione tramite file e sono gestiti con strumenti dedicati (o systemd).
Il daemon cron controlla la tabella di pianificazione (crontab) ed esegue programmi negli orari o intervalli specificati dall’utente. Ciò consente di automatizzare backup, aggiornamenti di sistema, controlli di integrità e molte altre attività di routine.
atd è un daemon simile, ma esegue le attività solo una volta in un momento specifico (a differenza di cron, che le esegue periodicamente).
sshd (Secure Shell Daemon) fornisce accesso remoto tramite il protocollo SSH. xrdp abilita connessioni desktop remote utilizzando il protocollo RDP. Agisce come daemon che ascolta le connessioni di rete su una porta specifica.
Nei sistemi moderni, il ruolo del “daemon principale” è svolto da systemd (che sostituisce il vecchio sistema SysV init). systemd è il primo processo che parte dopo il kernel ed è responsabile dell’avvio e della gestione di tutti gli altri servizi e processi. Li avvia in parallelo e gestisce le loro dipendenze. In breve, systemd è esso stesso un daemon che “orchestra” tutti gli altri del sistema.
Vantaggi:
Automazione: i daemon permettono di automatizzare il comportamento del sistema — dalla risposta alle richieste di rete alla pianificazione di attività — senza intervento dell’utente.
Isolamento: l’esecuzione sotto account o gruppi separati e il distacco dal terminale aumentano la sicurezza, limitando i danni potenziali in caso di compromissione.
Funzionamento continuo: un daemon può continuare a fornire servizi (come un server web) senza interruzioni anche se l’utente si disconnette o chiude la console.
Gestibilità: Linux fornisce strumenti di sistema (es. systemd, script di init) per gestire centralmente tutti i daemon: avvio, arresto, riavvio e registrazione.
Svantaggi:
Complessità di debug: poiché i daemon funzionano in background e non mostrano output su console, il debug richiede log dettagliati e configurazioni più complesse (flag di debug, tracciamento, ecc.).
Rischi di sicurezza: se un daemon viene eseguito con privilegi elevati (ad esempio come root), una vulnerabilità può compromettere l’intero sistema. È consigliabile eseguirli con privilegi limitati.
Gestione delle dipendenze: alcuni daemon possono fallire se, ad esempio, necessitano dell’accesso alla rete prima che questa sia disponibile. I moderni sistemi di init risolvono questo problema, ma con i vecchi script SysV init era comune.
Maggior consumo di risorse: qualsiasi processo in esecuzione continua consuma risorse di sistema (memoria, CPU). Un numero eccessivo di daemon può ridurre le prestazioni, soprattutto su sistemi con risorse limitate.
I daemon sono una parte fondamentale dell’architettura dei sistemi operativi Linux, offrendo ampie capacità di automazione e servizi in background. Consentono agli amministratori di configurare in modo flessibile operazioni di rete, attività pianificate, logging, sistemi di sicurezza e molti altri componenti.
Scrivere un proprio daemon richiede la comprensione di processi, segnali, chiamate di sistema e particolare attenzione alla registrazione e alla sicurezza.
I moderni sistemi di init (in particolare systemd) hanno semplificato la gestione dei daemon e la logica dei servizi, rendendo la creazione di servizi personalizzati più strutturata e flessibile. Tuttavia, rimane un campo complesso che richiede progettazione accurata, debug e manutenzione costante.
Se cerchi una soluzione affidabile, performante ed economica per i tuoi flussi di lavoro, Hostman offre opzioni di Hosting VPS Linux, tra cui Debian VPS, Ubuntu VPS e VPS CentOS.