Dipendenze systemd: guida a After, Before, Wants e Requires
Nei precedenti articoli abbiamo imparato a creare una Unit e a gestirla con systemctl.
Nella pratica, però, un servizio raramente funziona in modo completamente autonomo.
Pensiamo, ad esempio, a un server web: prima di essere avviato potrebbe aver bisogno che la rete sia già disponibile. Oppure un’applicazione potrebbe dipendere da un database che deve essere in esecuzione.
Per gestire queste situazioni, systemd mette a disposizione un sistema di dipendenze che permette di stabilire sia l’ordine di avvio sia le relazioni tra le diverse Unit.
Comprendere la differenza tra direttive come After=, Before=, Wants= e Requires= è fondamentale per creare servizi affidabili e prevedibili.
Cosa imparerai
Al termine di questa guida saprai:
- distinguere tra ordine di avvio e dipendenza;
- utilizzare correttamente
After=eBefore=; - capire quando usare
Wants=oRequires=; - evitare uno degli errori più comuni nella scrittura dei file
.service.
Due concetti diversi: ordine e dipendenza
Questo è probabilmente il concetto più importante dell’intero articolo.
Molti pensano che:
After=network.targetsignifichi:
“avvia prima la rete.”
In realtà non è così.
After= non avvia alcun servizio.
Dice solamente:
“Se entrambe le Unit verranno avviate, questa dovrà partire dopo l’altra.”
Lo stesso vale per:
Before=che indica l’ordine opposto.
In altre parole:
- After e Before definiscono l’ordine.
- Non definiscono chi deve essere avviato.
Questo è uno dei concetti più importanti di systemd.
Wants e Requires: le vere dipendenze
Le direttive Wants= e Requires= hanno invece uno scopo differente.
Quando una Unit contiene:
Wants=database.servicesystemd proverà ad avviare anche database.service.
La differenza è nel comportamento in caso di errore.
Con:
Wants=la dipendenza è debole.
Se il database non parte, il servizio principale continuerà comunque ad avviarsi.
Con:
Requires=la dipendenza è forte.
Se il database non può essere avviato, anche il servizio principale verrà considerato non avviabile.
Il caso più comune: rete disponibile
Supponiamo di avere un’applicazione che necessita della rete.
Un esempio corretto potrebbe essere:
[Unit]
Wants=network-online.target
After=network-online.targetPerché entrambe le direttive?
Wants=chiede a systemd di attivare anchenetwork-online.target.After=stabilisce che il nostro servizio dovrà partire soltanto dopo che tale target sarà stato raggiunto.
È importante ricordare che una direttiva non sostituisce l’altra: le dipendenze e l’ordine di avvio sono due aspetti indipendenti.
L’errore più comune
Uno degli errori più frequenti è scrivere soltanto:
After=network.targete aspettarsi che la rete venga avviata automaticamente.
Non accadrà.
Allo stesso modo:
Requires=database.servicenon garantisce che il database venga avviato prima del nostro servizio.
Per ottenere entrambi i risultati è spesso necessario combinare le direttive.
Quando utilizzare ciascuna direttiva
| Direttiva | A cosa serve | Avvia l’altra Unit? | Impone un ordine? |
|---|---|---|---|
After= | Avviare dopo un’altra Unit | ❌ | ✅ |
Before= | Avviare prima di un’altra Unit | ❌ | ✅ |
Wants= | Dipendenza consigliata (soft) | ✅ | ❌ |
Requires= | Dipendenza obbligatoria (hard) | ✅ | ❌ |
Questa è probabilmente la tabella che molti lettori salveranno o stamperanno.
Errori comuni
- Confondere
After=con una dipendenza. - Utilizzare sempre
Requires=quandoWants=sarebbe sufficiente. - Dimenticare che ordine e dipendenza sono due concetti distinti.
- Non verificare il comportamento del servizio con
systemctl statusejournalctl.
Conclusioni
Le dipendenze rappresentano uno degli aspetti più potenti di systemd, ma anche uno dei più fraintesi.
Ricordare la distinzione tra ordine di avvio e relazione di dipendenza permette di evitare molti problemi nella realizzazione di servizi personalizzati e rende il comportamento del sistema più prevedibile.
Nel prossimo articolo vedremo come systemd organizza le diverse fasi dell’avvio del sistema attraverso i Target, il meccanismo che ha sostituito i tradizionali runlevel di SysVinit.
LICENZA E CONDIZIONI D’USO
Questo How-to è rilasciato sotto licenza Creative Commons Attribution-NonCommercial 3.0 Italy.
CONTATTI DELL’AUTORE
Marco Ciammella marco@orvietolinux.it
Orvieto Linux User Group info@orvietolinux.it