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
.serviceda 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.shInseriamo il seguente contenuto.
#!/bin/bash
while true
do
echo "$(date) - Il servizio è attivo" >> /tmp/hello-systemd.log
sleep 60
doneRendiamo quindi eseguibile il file.
sudo chmod +x /usr/local/bin/hello-systemd.shLo 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.serviceInseriamo 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.targetAnche 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-reloadQuesto 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.serviceVerifichiamone immediatamente lo stato.
systemctl status hello.serviceSe 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.logDovrebbero 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.serviceDa 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.serviceGli 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.serviceSe le informazioni non fossero sufficienti, è possibile consultare il journal con:
journalctl -u hello.serviceNe 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