Salta al contenuto principale

Orvieto Linux User Group | Promozione software libero a Orvieto

Come creare un servizio systemd: guida pratica al primo file .service

Nei precedenti articoli abbiamo scoperto cos’è systemd, come utilizzare systemctl e che ogni componente del sistema è rappresentato da una Unit.

È arrivato il momento di passare dalla teoria alla pratica.

In questa guida realizzeremo il nostro primo servizio systemd partendo da zero. Non si tratterà di un servizio complesso, ma di un semplice esempio che permetterà di comprendere il funzionamento dei file .service e il modo in cui systemd li interpreta.

L’obiettivo non è imparare tutte le opzioni disponibili, ma acquisire un metodo che potrà poi essere applicato a qualsiasi applicazione o script.

Cosa imparerai in questa guida

Al termine dell’articolo sarai in grado di:

  • creare un file .service da zero;
  • installarlo nella posizione corretta;
  • ricaricare systemd;
  • avviare e arrestare il servizio;
  • abilitarne l’avvio automatico;
  • verificare il corretto funzionamento.

Prima di iniziare: cos’è un file .service?

Un file .service è un semplice file di testo che descrive a systemd come deve essere eseguito un programma.

Al suo interno troviamo informazioni come:

  • il comando da avviare;
  • il momento in cui il servizio deve partire;
  • il comportamento in caso di errore;
  • le dipendenze da altri servizi;
  • il livello di integrazione con il sistema.

Possiamo immaginarlo come una scheda di istruzioni che systemd legge ogni volta che deve gestire quel servizio.

Una volta salvato il file nella posizione corretta, sarà possibile amministrarlo con gli stessi comandi utilizzati per qualsiasi altro servizio del sistema.


Un esempio pratico

Per comprendere il meccanismo realizziamo un servizio molto semplice.

Creiamo innanzitutto uno script.

sudo nano /usr/local/bin/hello-systemd.sh
 

Inseriamo il seguente contenuto.

 
#!/bin/bash

while true
do
    echo "$(date) - Il servizio è attivo" >> /tmp/hello-systemd.log
    sleep 60
done
 

Rendiamo quindi eseguibile il file.

sudo chmod +x /usr/local/bin/hello-systemd.sh
 

Lo script non fa altro che scrivere periodicamente una riga in un file di log.

È volutamente semplice, perché il nostro obiettivo è capire il funzionamento di systemd e non dello scripting Bash.


Creiamo il nostro primo file .service

Ora realizziamo la Unit.

sudo nano /etc/systemd/system/hello.service
 

Inseriamo il seguente contenuto.

 
[Unit]
Description=Servizio di esempio per OrvietoLinux
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/hello-systemd.sh
Restart=always

[Install]
WantedBy=multi-user.target
 

Anche se il file può sembrare ricco di direttive, in realtà contiene solo pochi elementi fondamentali.

La sezione [Unit] descrive il servizio e specifica eventuali dipendenze.

La sezione [Service] indica quale programma deve essere eseguito e come systemd deve comportarsi durante il suo ciclo di vita.

Infine, la sezione [Install] definisce quando il servizio dovrà essere attivato automaticamente.

Nelle prossime guide analizzeremo nel dettaglio ciascuna direttiva.


Informare systemd che esiste una nuova Unit

Dopo aver creato un nuovo file .service, systemd non lo riconosce automaticamente.

È necessario aggiornare il proprio database interno.

sudo systemctl daemon-reload
 

Questo comando dice a systemd di rileggere tutte le Unit disponibili.

È un passaggio che molti principianti dimenticano e che rappresenta una delle cause più comuni di errore quando si crea un nuovo servizio.


Avviare e verificare il servizio

A questo punto possiamo avviare il servizio.

sudo systemctl start hello.service
 

Verifichiamone immediatamente lo stato.

systemctl status hello.service
 

Se tutto è stato configurato correttamente dovremmo ottenere uno stato simile a:

Active: active (running)
 

Possiamo inoltre controllare il file di log generato. 

cat /tmp/hello-systemd.log
 

Dovrebbero comparire le righe prodotte dal nostro script.


Attivare l’avvio automatico

Per fare in modo che il servizio venga eseguito automaticamente a ogni avvio del sistema utilizziamo:

sudo systemctl enable hello.service
 

Da questo momento il servizio verrà avviato durante il boot senza richiedere ulteriori interventi.

Se in futuro non fosse più necessario, sarà sufficiente utilizzare: 

sudo systemctl disable hello.service
 

Gli errori più comuni

Quando si realizza il primo servizio systemd è normale imbattersi in qualche problema.

I più frequenti sono:

  • dimenticare daemon-reload;
  • percorso errato nello ExecStart;
  • script non eseguibile;
  • errori di sintassi nel file .service;
  • permessi insufficienti.

In presenza di problemi, il comando più utile rimane: 

systemctl status hello.service
 

Se le informazioni non fossero sufficienti, è possibile consultare il journal con:

journalctl -u hello.service
 

Ne parleremo in dettaglio nel prossimo articolo dedicato a journalctl.


 

Conclusioni

Creare un servizio systemd è molto meno complesso di quanto possa sembrare.

Una volta compresa la struttura di un file .service, sarà possibile automatizzare script, applicazioni e programmi personalizzati integrandoli completamente nel sistema operativo.

L’esempio visto in questa guida rappresenta soltanto il punto di partenza. Systemd offre numerose direttive per gestire dipendenze, riavvii automatici, utenti dedicati, limiti di risorse e meccanismi di sicurezza avanzati.

Nel prossimo articolo inizieremo a esplorare uno degli strumenti più utili per ogni amministratore di sistema: journalctl, il comando che permette di consultare e analizzare i log prodotti da systemd e dai servizi in esecuzione.

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