Daemontools è un insieme di programmi di D.J. Bernstein che (tra le altre cose) permettono l'avvio, il monitoring e il logging di arbitrari servizi di sistema ed è tipicamente necessario per gestire i software realizzati da DJB (djbdns, qmail).
Presenta caratteristiche interessanti che lo rendono una alternativa ad altri metodi di avvio di servizi (Directory init.d, file inittab, file rc.local, console tty) ma si basa su una logica e una struttura del file system che fa "standard a se", al di fuori di quelli condivisi in diversi ambienti Unix.
Con daemontools il sistema, infatti, si popola di inedite directory:
/service
contiene dei link simbolici che puntano a directory che definiscono le modalità con cui avviare un servizio. La semplice presenza del link in questa directory fa in modo che il servizio venga avviato (o riavviato, in caso di crash del programma) entro 5 secondi.
/command
contiene link simbolici a comandi di sistema vari (di default quelli che fanno parte della suite daemontools)
/package
contiene i pacchetti software installati.
Secondo DJB, i vantaggi di daemontools sono vari:
- Facilità di installazione e rimozione dei servizi (basta mettere o togliere un link simbolico nella directory)
- Facilità di avvio e gestione dei servizi: una volta inserito il link in /service, il servizo parte entro 5 secondi, se cade, viene riavviato
- Facilità di gestione dei segnali da dare ai servizi. Con il comando svc
si può avviare, stoppare, terminare un servizio senza cercare il suo pid.
- Uniformità dell'ambiente in cui viene avviato un servizio: quando questo viene riavviato è in uno stato pulito, analogo a quello durante il boot
- Portabilità: la struttura in service funziona su ogni sistema Unix.
Gli svantaggi sono che nulla di tutto questo segue gli standard Unix ufficiali.
INSTALLAZIONE
Installare i Daemontools è semplice. Se si usa un pacchetto (tipicamente chiamato "daemontools") la procedura è quella tipica per la propria distribuzione (spesso il pacchetto va cercato fra repository non ufficiali, in quanto la sua logica introduce le anormalità sopra descritte nella coerenza di un sistema Linux).
La procedura manuale è ben descritta sul sito ufficiale:
ter:~# cd /tmp ; wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
--09:25:09-- http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
=> `daemontools-0.76.tar.gz'
[...]
ter:~# mkdir -p /package
ter:~# chmod 1755 /package
ter:~# cd /package
ter:/package# tar -zxvf /tmp/daemontools-0.76.tar.gz
ter:/package# cd admin/daemontools-0.76
ter:/package/admin/daemontools-0.76# package/install
Linking ./src/* into ./compile...
Compiling everything in ./compile...
[...]
Copying commands into ./command...
Creating symlink daemontools -> daemontools-0.76...
Making command links in /command...
Making compatibility links in /usr/local/bin...
Creating /service...
Adding svscanboot to inittab...
init should start svscan now.
Come si può intravedere, viene partire da init stesso il comando svscanboot
, mediante la configurazione SV:123456:respawn:/command/svscanboot
in /etc/inittab
.
Questo mette la directory /command
all'inizio della variabile PATH e lancia svscan /service
, che si occupa di monitorare e avviare i servizi in /service
, e readproctitle service errors
che si occupa di gestire il logging.
Il risultato è la presenza, già al termine dell'installazione e ad ogni riavvio, dei seguenti servizi (che girano come root):
root 1047 1 0 10:46 ? 00:00:00 /bin/sh /command/svscanboot
root 1087 1047 0 10:46 ? 00:00:00 svscan /service
root 1088 1047 0 10:46 ? 00:00:00 readproctitle service errors: ........................................
I puntini indicano che va tutto bene, altrimenti vengono sostituiti da messaggi di errore.
COMANDI
Per ogni servizio da avviare, svcsan lancia il comando supervise nomeservizio
che provvede ad eseguire lo script shell /service/nomeservizio/run
dove va messo di fatto il comando che avvia il servizio desiderato.
Nella directory /service/nomeservizio
viene creata una sottodirectory chiamata supervise
dove sono scritte, in forma binaria, informazioni di stato sul servizio che possono essere interpretate con il comando svstat
.
Per gestire i servizi si usa il comando svc
:
svc -u nomeservizio
avvia o riavvia il servizio /service/nomeservizio.
svc -d nomeservizio
termina in modo pulito (SIGTERM) un servizio.
svc -p nomeservizio
, svc -c nomeservizio
mette in pausa (SIGSTOP) o continua (SIGCONT) un servizio.
svc -k nomeservizio
termina brutalmente (SIGKILL) un servizio.
Altri comandi fra i daemontools:
Il comando multilog
riceve in stdin una sequenza arbitraria di righe, le filtra eventualmente secondo criteri diversi, e lo salva su uno o più file di log, gestendo eventuali rotazioni.
fghack
prova a gestire servizi che si mettono automaticamente in background (supervise li deve far girare in foreground).
envdir
imposta le variabili d'ambiente secondo i file presenti nella directory indicata.
softlimit
esegue un altro programma impostando limiti sull'utilizzo di risorse quali memoria e CPU utilizzata, file aperti ecc.
daemontools & FreeBSD
sono totalmente incompatibili, dal punto di vista della logica.
Che poi "a manina" sia possibile stravolgere il modus operandi di un sistema BSD x far finta che sia un linux e' pur vero ma il risultato e' una oscenita'; in modo drammaticamente evidente se e quando si faccia uso ordinario di "portupgrade -varR".