Systemctl: gestire i servizi e le unità di systemd
Su Linux, systemctl svolge un ruolo centrale nell’amministrazione del sistema init e del gestore di servizi systemd. Questo comando permette all’utente di controllare i servizi, le unità e le configurazioni di systemd. Ciò lo rende uno strumento indispensabile per l’amministrazione del sistema. Dal controllo dell’avvio alla personalizzazione degli stati del sistema, systemctl offre una gamma di funzioni completa.
Che cos’è systemctl?
systemctl è uno strumento a riga di comando per la gestione di systemd, un sistema di init e gestione del sistema per sistemi operativi Linux, mentre systemd è oggi il sistema init standard per molte distribuzioni Linux e distribuzioni Linux per i server come Ubuntu, Debian, Fedora, Red Hat Enterprise Linux (RHEL), CentOS, Arch Linux, Mageia o Gentoo, ma non è implementato universalmente in tutte le distribuzioni.
Nell’ecosistema systemd, systemctl svolge un ruolo centrale nella gestione dei servizi di sistema, nella configurazione, nel comportamento di avvio e nella manutenzione. Le funzionalità dello strumento vanno oltre il semplice avvio e arresto dei servizi e offrono un controllo completo su quasi tutti gli aspetti di un sistema Linux.
Nel seguente tutorial sono riportati esempi pratici di codice e comandi Linux per l’utilizzo di systemctl sulla base di Ubuntu 22.04.
Gestione dei servizi
Lo scopo principale del sistema init è quello di avviare i componenti necessari dopo l’avvio del kernel Linux (componenti “userland”). Inoltre, il sistema di init viene utilizzato per controllare efficacemente i servizi e i demoni di un server in qualsiasi momento dell’esecuzione del sistema.
All’interno di systemd, la maggior parte dei processi è incentrata sulle cosiddette unità, ossia risorse gestite da systemd. Queste unità sono classificate in base al tipo di risorsa che rappresentano e sono definite dai cosiddetti file unit. Il tipo di unità può essere riconosciuto dall’estensione del file.
Nella gestione dei servizi, svolgono un ruolo fondamentale le unità di servizio che terminano con il suffisso .service. Spesso, però, non è necessario specificare questo suffisso per i comandi di gestione dei servizi, poiché normalmente systemd è in grado di riconoscere che questi comandi si riferiscono a essi.
Avvio e interruzione dei servizi
Le operazioni più comuni eseguite tramite systemctl in Linux includono l’avvio e l’interruzione dei servizi. Queste funzioni sono fondamentali per l’amministrazione del sistema e permettono di mantenere il controllo sui processi in esecuzione. Per avviare un servizio, usa il comando start
. Se stai lavorando come utente senza permessi di root, devi utilizzare sudo
:
$ sudo systemctl start application.service
bashPoiché systemd è progettato per cercare automaticamente i file .service per i comandi di gestione dei servizi, il comando può essere inserito anche in forma semplificata:
$ sudo systemctl start application
bashAd esempio, per avviare il server web Apache, devi inserire:
$ sudo systemctl start apache2
bashPer fermare un servizio in esecuzione, usa stop
:
$ sudo systemctl stop application.service
bash- Traffico illimitato e fino a 1 Gbit/s di larghezza di banda
- Storage SSD NVMe veloce
- Plesk Web Host Edition incluso
Riavviare e ricaricare
Per riavviare un servizio, operazione spesso necessaria dopo una modifica delle configurazioni, usa il comando restart
:
$ sudo systemctl restart application.service
bashSe l’applicazione interessata è in grado di ricaricare i file di configurazione senza riavviare, è possibile avviare questo processo utilizzando il comando reload
:
$ sudo systemctl reload application.service
bashSe non sai con certezza se un servizio offre la possibilità di ricaricare la sua configurazione, puoi usare il comando reload-or-restart
. Questo comando ricarica la configurazione se l’opzione è supportata. Nel caso in cui non lo sia, il comando riavvia il servizio per applicare la configurazione aggiornata.
$ sudo systemctl reload-or-restart application.service
bashAttivare e disattivare i servizi
Attivando e disattivando i servizi, è possibile specificare se un servizio deve essere eseguito automaticamente all’avvio del sistema. Si tratta di una funzione particolarmente utile per controllare le prestazioni del sistema, oltre che per la gestione della sicurezza e delle dipendenze tra i diversi servizi. Per configurare un servizio in modo che venga eseguito automaticamente all’avvio del sistema, usa il comando enable
:
$ sudo systemctl enable application.service
bashAll’esecuzione di questo processo, viene creato un collegamento simbolico. Questo collegamento collega la copia del file di servizio del sistema, che di solito si trova in /lib/systemd/system o /etc/systemd/system, con la directory sul disco rigido in cui systemd cerca i file per l’avvio automatico, che di solito avviene in /etc/systemd/system/some_target.target.wants.
$ sudo systemctl enable application.service
bashPer evitare che un servizio venga eseguito automaticamente all’avvio, usa il comando disable
:
$ sudo systemctl disable application.service
bashIn questo modo viene eliminato il collegamento simbolico che in precedenza specificava che il servizio doveva avviarsi automaticamente. Attenzione: la semplice attivazione di un servizio non comporta il suo avvio immediato nella sessione corrente. Per avviare immediatamente il servizio e configurarlo in modo che venga eseguito automaticamente all’avvio, devi utilizzare sia il comando start
che enable
.
Verificare lo stato dei servizi
Con systemctl è possibile visualizzare informazioni dettagliate sullo stato dei servizi. Questa funzione è utile per monitorare e diagnosticare lo stato attuale dei servizi di sistema e delle applicazioni. Per effettuare la verifica, utilizza il comando status
:
$ systemctl status application.service
bashQuesto comando fornisce un’ampia gamma di informazioni, tra cui lo stato attuale del servizio (attivo, inattivo, difettoso, ecc.), i processi e i messaggi di log eseguiti più di recente, la gerarchia del cgroup e le prime righe di log.
Puoi verificare lo stato di attività di un servizio in Linux con systemctl utilizzando is-active
. Questo comando specifica se un servizio è attualmente attivo o meno:
$ systemctl is-active application.service
bashSe il servizio è attivo, lo stato viene indicato come active
. Se è inattivo, viene invece indicato come inactive
.
Per verificare se un servizio è configurato per essere attivato automaticamente all’avvio del sistema, puoi utilizzare il comando is-enabled
, che risulta particolarmente utile per gestire la configurazione di avvio dei servizi su un sistema Linux.
$ systemctl is-enabled application.service
bashIl comando indica se il servizio è attivato o disattivato e imposta il codice di uscita a “0” o “1” in base alla risposta.
Il comando is-failed
permette inoltre di verificare se uno specifico servizio presenta uno stato di errore:
$ systemctl is-failed application.service
bashSe l’esecuzione ha esito positivo, viene emesso active
, altrimenti viene visualizzato failed
. Se l’unità è stata arrestata intenzionalmente, la risposta può essere unknown
o inactive
. Un valore di uscita di 0
segnala il verificarsi di un errore, mentre 1
indica qualsiasi altro stato.
Panoramica sullo stato del sistema
Finora abbiamo presentato comandi mirati alla gestione di singoli servizi, che da soli non sono però in grado di fornire una visione completa dello stato attuale del sistema. Esistono però numerosi comandi systemctl in grado di produrre esattamente questo tipo di informazioni.
list-units
è uno strumento utile per avere una panoramica delle unità correnti su Linux:
$ systemctl list-units
bashUna volta eseguito il comando, systemctl visualizza un elenco delle unità gestite da systemd. L’output di questo elenco contiene varie colonne con informazioni specifiche su ogni unità:
- UNIT: il nome dell’unità, solitamente il nome del file unit corrispondente, ad esempio sshd.service per il demone SSH.
-
LOAD: indica se il file unit è stato caricato con successo; i valori possibili sono
loaded
,not-found
eerror
. -
ACTIVE: lo stato di attività dell’unità; può assumere valori come
active
,inactive
,activating
edeactivating
. -
SUB: lo stato dell’attività subordinata, che fornisce ulteriori dettagli sullo stato dell’unità; ad esempio, un’unità
active
potrebbe avere uno stato SUB dirunning
,exited
ofailed
. - DESCRIPTION: una breve descrizione dell’unità, che spesso riflette lo scopo o la funzionalità dell’unità.
Per impostazione predefinita, però, il comando mostra solo le unità attive. Per questo motivo la colonna LOAD dell’output mostra tipicamente loaded
e la colonna ACTIVE active
. Tramite flag aggiuntivi, systemctl può essere configurato in modo da visualizzare anche informazioni estese. Ad esempio, per visualizzare tutte le unità caricate da systemd, indipendentemente dal loro stato di attività, puoi utilizzare il flag --all
:
$ systemctl list-units --all
bashL’output può essere ulteriormente raffinato utilizzando flag aggiuntivi come --state=
per filtrare stati specifici nelle categorie LOAD, ACTIVE o SUB. Per visualizzare anche le unità inattive è importante mantenere il flag --all
:
$ systemctl list-units --all --state=inactive
bashPuoi utilizzare inoltre il filtro --type=
per visualizzare esclusivamente alcuni tipi di unità, ad esempio solo le unità di servizio attive:
$ systemctl list-units --type=service
bashElenco di tutti i file unit
Per visualizzare un elenco di tutti i file unit su Linux con systemctl, compresi quelli che systemd non ha tentato di caricare, puoi usare list-unit-files
. Questo comando mostra tutti i file unit conosciuti da systemd, compresi servizi, socket, target e altro ancora.
$ systemctl list-units-files
bashIl comando visualizza i vari stati dei file unit, che indicano come sono configurate le rispettive unità, in particolare per quanto riguarda il loro comportamento all’avvio del sistema. Gli stati più comuni sono i seguenti:
- Enabled: l’unità è configurata in modo da essere attivata automaticamente all’avvio del sistema.
- Disabled: l’unità non è configurata per avviarsi automaticamente durante il processo di boot.
- Masked: l’unità è completamente disattivata in modo da non poter essere avviata né manualmente né automaticamente.
- Static: l’unità non viene avviata in modo indipendente, ma tipicamente dipende da un’altra unità e viene avviata solo in questo contesto.
Gestione delle unità
La gestione delle unità è uno dei compiti principali di systemctl. Per ottenere informazioni più specifiche sulle singole unità e per gestirle, systemctl offre una serie di comandi e opzioni utili.
Visualizzare un file unit
Per visualizzare il contenuto di uno specifico file unit direttamente nella console, puoi utilizzare il comando cat
. Ad esempio, per visualizzare il file unit di un servizio come ssh.service, devi inserire:
$ systemctl cat ssh.service
bashVisualizzare le dipendenze
Le dipendenze di un’unità specifica possono essere visualizzate come una struttura ad albero utilizzando list-dependencies
. Il comando si presenta in questo modo:
$ systemctl list-dependencies sshd.service
bashPer impostazione predefinita, le dipendenze vengono visualizzate per le unità .target
che rappresentano diversi stati del sistema. Per ottenere un elenco completo e ricorsivo di tutte le dipendenze, puoi utilizzare il flag --all
.
Per visualizzare le dipendenze inverse, cioè le unità che dipendono dall’unità specificata, aggiungi --reverse
al comando. Inoltre, i flag --before
e --after
ti permettono di vedere le dipendenze che iniziano prima o dopo l’unità in questione.
Applicare ed eliminare una maschera da un’unità
La mascheratura di un’unità la disabilita in modo che non possa essere avviata né manualmente né automaticamente. Si usa spesso per garantire che un servizio o un’unità non vengano avviati accidentalmente o automaticamente dalle dipendenze. La mascheratura avviene creando un collegamento simbolico del file dell’unità in questione a /dev/null
con il comando mask
:
$ sudo systemctl mask nginx.service
bashQuesto assicura che il servizio Nginx non possa essere avviato né manualmente né automaticamente mentre è in modalità di mascheratura.
L’eliminazione della mascheratura annulla lo stato di mascheratura dell’unità, rendendola nuovamente avviabile. Il comando per eliminare la mascheratura è unmask
:
$ sudo systemctl unmask nginx.service
bashModificare i file unit
systemctl dispone di opzioni per personalizzare e modificare i file unit. Questa funzionalità è stata introdotta con la versione 218 di systemd. Utilizzando il comando edit
, viene aperto automaticamente un file unit dell’unità selezionata, pronto per essere modificato:
$ sudo systemctl edit nginx.service
bashDurante la modifica, viene creato un file vuoto per aggiungere istruzioni specifiche alla definizione di un’unità o modificarle. Per ogni unità, ad esempio nginx.service
, viene creata una sottocartella nella directory /etc/systemd/system
con il nome del file con l’aggiunta di .d
- in questo caso nginx.service.d
.
Il file override.conf
viene creato in questa sottocartella. Quando systemd carica l’unità, combina il contenuto di questo file snippet con il file unit originale, in modo che le istruzioni dello snippet abbiano la priorità. Per elaborare l’intero file unit, è possibile utilizzare il flag --full
:
$ sudo systemctl edit --full nginx.service
bashCon --full
si apre il file unit esistente in un editor per apportare modifiche. Quando esci dall’editor, il sistema salva il file modificato in /etc/systemd/system
.
Per annullare le modifiche apportate, puoi cancellare la directory di configurazione .d
dell’unità o il file modificato in /etc/systemd/system
:
$ sudo rm -r /etc/systemd/system/nginx.service.d
bashCon il seguente comando è possibile eliminare un file unit completamente revisionato:
$ sudo rm /etc/systemd/system/nginx.service
bashDopo aver rimosso il file o la directory, è necessario ricaricare systemd in modo che smetta di fare riferimento ai file eliminati e torni alla copia del sistema:
$ sudo systemctl daemon-reload
bashPersonalizzare lo stato del sistema (runlevel) con i target
I target in systemd sono utilizzati principalmente per raggruppare diverse unità al fine di realizzare specifici stati del sistema, in modo simile ai runlevel di altri sistemi init. I file con il suffisso .target
fungono da punti di riferimento che indicano lo stato di disponibilità di determinate funzioni, in modo che l’utente possa specificare lo stato generale desiderato invece delle singole unità richieste.
Un esempio pratico è rappresentato da swap.target
, che indica lo stato di preparazione allo swap. Le unità che sono coinvolte nel processo di swap possono sincronizzarsi con questo target utilizzando opzioni di configurazione come WantedBy=
o RequiredBy=
. Le unità che dipendono da swap, invece, possono indicarlo con impostazioni come Wants=
, Requires=
e After=
per esprimere la loro dipendenza e la sequenza di avvio rispetto a swap.
Recupero e impostazione del target predefinito
Recuperare e impostare il target predefinito ti permette di definire uno stato di sistema predefinito che il tuo sistema deve raggiungere all’avvio. Di seguito il comando per trovare il target predefinito per il tuo sistema:
$ systemctl get-default
Output
multi-user.target
bashPer cambiare il target predefinito, usa il comando set-default
insieme al nome del target. Il seguente comando consente di impostare la destinazione predefinita su graphical.target
, avviando un’interfaccia utente grafica:
$ sudo systemctl set-default graphical.target
bashElenco dei target disponibili
Per ottenere un elenco di tutti i target disponibili sul tuo sistema, puoi utilizzare il seguente comando:
$ systemctl list-unit-files --type=target
bashIn questo modo viene visualizzato un elenco di tutti i file unit target installati sul sistema. Per ogni target vengono visualizzati il percorso e lo stato attuale (ad esempio, attivato o disattivato).
Isolare i target
Con isolate
puoi attivare tutte le unità che sono collegate a un target specifico e allo stesso tempo interrompere tutte le unità che non sono collegate a esso.
Supponiamo che tu stia lavorando in un ambiente con il graphical.target
attivo e voglia passare a una modalità multiutente pura senza interfaccia grafica. In questo caso, puoi disattivare il sistema grafico isolando multi-user.target
. Dal momento che graphical.target
dipende da multi-user.target
, ma non viceversa, tutti i servizi grafici vengono interrotti al momento del passaggio.
In ogni caso, prima di isolare un obiettivo, è opportuno verificare le dipendenze associate. In questo modo eviterai l’arresto involontario di processi importanti.
$ systemctl list-dependencies multi-user.target
bashUna volta che hai verificato e approvato le unità attive che desideri mantenere, puoi isolare la destinazione desiderata:
$ sudo systemctl isolate multi-user.target
bashUtilizzare le scorciatoie per gli eventi importanti
Esistono target specifici per operazioni basilari come lo spegnimento o il riavvio del sistema. In Linux, però, systemctl offre anche pratiche scorciatoie per funzioni aggiuntive. Ad esempio, per mettere il sistema in modalità di salvataggio (single user mode), puoi semplicemente usare rescue
invece di isolate rescue.target
:
$ sudo systemctl rescue
bashPuoi arrestare il sistema con halt
:
$ sudo systemctl halt
bashPuoi avviare uno spegnimento completo con poweroff
:
$ sudo systemctl poweroff
bashPer riavviare il sistema, invece, puoi utilizzare reboot
:
$ sudo systemctl reboot
bashQuesti comandi informano le persone connesse sugli eventi imminenti, cosa che non può essere ottenuta con la semplice esecuzione o isolamento del target. È importante sapere che molti computer collegano i comandi più brevi per queste azioni con systemd per assicurarne la corretta esecuzione.
Per riavviare il sistema, solitamente è sufficiente il seguente comando:
$ sudo reboot
bash