Daemon Linux, cosa sono e perché in realtà sono angeli

Cos'è un daemon e qual è il suo ruolo nei sistemi operativi GNU/Linux. Un concetto nato negli anni '60 resta essenziale per il funzionamento di qualunque piattaforma anche ai giorni nostri.

Nel vasto panorama dell’informatica, ci sono elementi che lavorano instancabilmente dietro le quinte per garantire il corretto funzionamento dei sistemi operativi. Tra questi, i daemon rappresentano un ingranaggio essenziale, svolgendo un ruolo fondamentale nel monitorare e nel gestire sottosistemi specifici senza richiedere l’intervento diretto dell’utente.

Il concetto di daemon (si legge “demon“) è radicato in ambiente GNU/Linux: esistono ad esempio appositi componenti che si occupano del monitoraggio e della gestione dei servizi di stampa, mentre un daemon di rete svolge il compito di verificare il corretto funzionamento degli aspetti legati al networking. I daemon eseguono determinate azioni in momenti stabiliti o in risposta a eventi specifici. Ne esistono molti su un sistema Linux, ognuno progettato appositamente per sorvegliare una parte specifica del sistema.

Per chi proviene dal mondo Windows, i daemon sono conosciuti come “servizi“. Anche nei sistemi macOS, che utilizzano un kernel ibrido di derivazione UNIX, si fa uso dei daemon: assumono però il nome di agenti.

Da cosa deriva il termine daemon

Il termine “daemon” ha origini antiche e la sua etimologia è ricca di significati e interpretazioni. Inizialmente, nella mitologia greca, un “daimon” era considerato uno spirito divino o un’intelligenza superiore che agiva come intermediario tra gli dei e gli esseri umani. Questi spiriti erano spesso associati a una sorta di guida o ispirazione, e potevano assumere molte forme e funzioni diverse.

In ambito informatico, il termine “daemon” è stato adottato nel 1963 con il progetto MAC del Massachusetts Institute of Technology (MIT), per indicare qualsiasi processo di sistema che monitora altre attività ed esegue azioni predefinite in base al loro comportamento. L’acronimo “Disk And Execution MONitor” è molto più recente ed è comunemente utilizzato ancora oggi.

Un “daemon” è insomma un programma o un processo che opera in background, spesso eseguendo compiti utili o essenziali per il funzionamento del sistema, come il monitoraggio di servizi o la gestione delle risorse.

Come verificare quali componenti sono in esecuzione su un sistema Linux

Se si utilizza una macchina Linux, per individuare i daemon in esecuzione si può analizzare la lista dei processi in esecuzione servendosi di comandi come ps, top e htop. I processi che terminano con la lettera “d” sono spesso daemon che si occupano di uno specifico compito.

Il comando pstree mostra i processi attualmente in esecuzione sul sistema in forma di diagramma ad albero. Eseguendo il comando pstree da terminale, è possibile ottenere un elenco completo dei processi in esecuzione, daemon inclusi. Grazie a questa efficace rappresentazione grafica, si può avere una visione chiara di ciò che accade nel proprio sistema.

Ecco, di seguito, un esempio semplificato di un possibile output del comando pstree:

systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─acpid
        ├─avahi-daemon───avahi-daemon
        ├─bluetoothd
        ├─cron
        ├─cups-browsed
        ├─2*[cupsd]
        ├─dbus-daemon
        ├─2*[gnome-keyring-d───5*[{gnome-keyring-d}]]
        ├─gpg-agent
        ├─gvfsd───────────2*[{gvfsd}]
        ├─ibus-daemon─┬─ibus-dconf───2*[{ibus-dconf}]
        │             ├─ibus-engine-sim───2*[{ibus-engine-sim}]
        │             └─2*[{ibus-daemon}]
        ├─2*[irqbalance───{irqbalance}]
        ├─lightdm─┬─Xorg───2*[{Xorg}]
        │         ├─lightdm─┬─upstart─┬─upstart-dbus-bridg───dbus-daemon
        │         │         │         └─2*[{upstart}]
        │         │         └─upstart-udev-br
        │         ├─lightdm─┬─sh───Xorg───2*[{Xorg}]
        │         │         ├─2*[upstart───2*[{upstart}]]
        │         │         ├─upstart-dbus-bridg───dbus-daemon
        │         │         └─upstart-udev-br
        │         ├─lightdm─┬─upstart─┬─upstart-dbus-bridg───dbus-daemon
        │         │         │         └─2*[{upstart}]
        │         │         └─upstart-udev-br
        │         ├─lightdm───lightdm─┬─gnome-session─┬─applet.py───2*[{applet.py}]
        │         │                     │               ├─deja-dup-monito───2*[{deja-dup-monito}]
        │         │                     │               ├─evolution-calen───4*[{evolution-calen}]
        │         │                     │               ├─evolution-sourc───2*[{evolution-sourc}]
        │         │                     │               ├─gnome-power-man───2*[{gnome-power-man}]
        │         │                     │               ├─gnome-session-b───2*[{gnome-session-b}]
        │         │                     │               ├─gnome-settings-───3*[{gnome-settings-}]
        │         │                     │               ├─gnome-shell-cal───5*[{gnome-shell-cal}]
        │         │                     │               ├─gnome-shell-ove───3*[{gnome-shell-ove}]
        │         │                     │               ├─gnome-terminal-───2*[{gnome-terminal-}]
        │         │                     │               ├─gnome-wm───2*[{gnome-wm}]
        │         │                     │               ├─nautilus───2*[{nautilus}]
        │         │                     │               ├─ssh-agent
        │         │                     │               ├─zeitgeist-datah───{zeitgeist-datah}
        │         │                     │               └─3*[{gnome-session}]
        │         │                     ├─{lightdm}
        │         │                     ├─{upstart}
        │         │                     └─{upstart-udev-br}
        │         ├─{lightdm}
        │         └─{lightdm}
        ├─2*[nmbd]
        ├─polkitd───{polkitd}
        ├─rsyslogd───3*[{rsyslogd}]
        ├─rtkit-daemon───2*[{rtkit-daemon}]
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─udisksd───4*[{udisksd}]
        ├─upowerd───2*[{upowerd}]
        ├─whoopsie───2*[{whoopsie}]
        ├─wpa_supplicant
        └─xdg-permission-───2*[{xdg-permission-}]

Quello presentato è solamente un esempio parziale ma mostra la struttura gerarchica dei processi sul sistema, con il daemon systemd (ne parliamo più avanti) come processo radice e i suoi sottoprocessi elencati al di sotto di esso. Ogni processo è rappresentato con il suo nome, seguito da eventuali processi figlio.

Il forking è un concetto chiave nella creazione dei processi in Linux. Di solito, per creare un processo, si effettua una copia di un processo esistente per generare un nuovo processo figlio. Il processo di inizializzazione è responsabile della creazione dei daemon: i fork effettuati in successione permettono di avviare i processi necessari per il corretto funzionamento del sistema.

Qualche esempio di daemon

Abbiamo accennato in precedenza che i daemon Linux sono identificabili attraverso il suffisso “d”. Di seguito sono riportati alcuni esempi di daemon che potrebbero essere in esecuzione su di un sistema Linux:

  • systemd: Un daemon che ha il compito di unificare la configurazione e il comportamento dei servizi tra le varie distribuzioni Linux.
  • rsyslogd: Utilizzato per la registrazione dei messaggi di sistema, rappresenta una versione avanzata di syslogd, con numerose funzionalità aggiuntive.
  • crond: Daemon ampiamente utilizzato per programmare l’esecuzione di specifiche attività sul sistema. Ad esempio aggiornamenti software e procedure automatizzate.
  • udisksd: Per sovrintendere le operazioni di montaggio, smontaggio e la formattazione dei dispositivi di archiviazione, si utilizza questo ulteriore daemon.
  • logind: Un daemon piuttosto agile e compatto che gestisce i login degli utenti e le sessioni in vari modi.
  • httpd: Gestore del servizio HTTP, comunemente utilizzato con software i server Web come Apache.
  • sshd: Daemon responsabile della gestione del servizio SSH, utilizzato su praticamente tutti i server che accettano connessioni SSH.
  • ftpd: Gestisce il servizio FTP (File Transfer Protocol), ampiamente utilizzato per il trasferimento di file tra computer.

Come gestire i daemon

Per avviare automaticamente un daemon durante il boot del sistema, è possibile creare un’apposita unità di sistema systemd o utilizzare script di avvio personalizzati ponendoli nella directory /etc/init.d/.

Per monitorare lo stato dei daemon, si può ricorrere a comandi come systemctl status e ps aux, oppure utilizzando strumenti di monitoraggio più avanzati come Nagios o Zabbix.

Il riavvio e l’arresto di ciascun daemon può essere richiesto utilizzando, rispettivamente, i comandi systemctl restart e systemctl stop, oppure tramite script di avvio personalizzati.

I log dei daemon sono tipicamente gestiti da syslog o rsyslog: la loro creazione può essere impostata tramite specifici file di configurazione specifici.

Durante l’applicazione degli aggiornamenti software, è importante assicurarsi che questi componenti siano fermati e riavviati in modo corretto, così da non provocare interruzioni del servizio. Si pensi ad esempio a server Web e database che concorrono alla corretta erogazione di un ampio numero di applicazioni: quando uno o più daemon sono arrestati, un’applicazione Web potrebbe non risultare temporaneamente più accessibile e fruibile.

Credit immagine in apertura: Copilot Designer.

Ti consigliamo anche

Link copiato negli appunti