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
bash

Poiché 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
bash

Ad esempio, per avviare il server web Apache, devi inserire:

$ sudo systemctl start apache2
bash

Per fermare un servizio in esecuzione, usa stop:

$ sudo systemctl stop application.service
bash
Server virtuali (VPS)
Virtualizzazione totale con accesso root completo
  • 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
bash

Se 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
bash

Se 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
bash

Attivare 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
bash

All’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
bash

Per evitare che un servizio venga eseguito automaticamente all’avvio, usa il comando disable:

$ sudo systemctl disable application.service
bash

In 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
bash

Questo 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
bash

Se 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
bash

Il 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
bash

Se 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
bash

Una 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 e error.
  • ACTIVE: lo stato di attività dell’unità; può assumere valori come active, inactive, activating e deactivating.
  • SUB: lo stato dell’attività subordinata, che fornisce ulteriori dettagli sullo stato dell’unità; ad esempio, un’unità active potrebbe avere uno stato SUB di running, exited o failed.
  • 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
bash

L’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
bash

Puoi 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
bash

Elenco 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
bash

Il 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
bash

Visualizzare 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
bash

Per 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
bash

Questo 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
bash

Modificare 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
bash

Durante 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
bash

Con --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
bash

Con il seguente comando è possibile eliminare un file unit completamente revisionato:

$ sudo rm /etc/systemd/system/nginx.service
bash

Dopo 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
bash

Personalizzare 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
bash

Per 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
bash

Elenco 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
bash

In 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
bash

Una volta che hai verificato e approvato le unità attive che desideri mantenere, puoi isolare la destinazione desiderata:

$ sudo systemctl isolate multi-user.target
bash

Utilizzare 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
bash

Puoi arrestare il sistema con halt:

$ sudo systemctl halt
bash

Puoi avviare uno spegnimento completo con poweroff:

$ sudo systemctl poweroff
bash

Per riavviare il sistema, invece, puoi utilizzare reboot:

$ sudo systemctl reboot
bash

Questi 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
Hai trovato questo articolo utile?
Per offrirti una migliore esperienza di navigazione online questo sito web usa dei cookie, propri e di terze parti. Continuando a navigare sul sito acconsenti all’utilizzo dei cookie. Scopri di più sull’uso dei cookie e sulla possibilità di modificarne le impostazioni o negare il consenso.
Page top