Salta al contenuto principale

Orvieto Linux User Group | Promozione software libero a Orvieto

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= e Before=;
  • capire quando usare Wants= o Requires=;
  • 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.target
 

significhi:

“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.service
 

systemd 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.target
 

Perché entrambe le direttive?

  • Wants= chiede a systemd di attivare anche network-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.target
 

e aspettarsi che la rete venga avviata automaticamente.

Non accadrà.

Allo stesso modo:

 
Requires=database.service
 

non garantisce che il database venga avviato prima del nostro servizio.

Per ottenere entrambi i risultati è spesso necessario combinare le direttive.


Quando utilizzare ciascuna direttiva

DirettivaA cosa serveAvvia 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= quando Wants= sarebbe sufficiente.
  • Dimenticare che ordine e dipendenza sono due concetti distinti.
  • Non verificare il comportamento del servizio con systemctl status e journalctl.

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