Su Linux, systemctl svolge un ruolo centrale nell’am­mi­ni­stra­zio­ne del sistema init e del gestore di servizi systemd. Questo comando permette all’utente di con­trol­la­re i servizi, le unità e le con­fi­gu­ra­zio­ni di systemd. Ciò lo rende uno strumento in­di­spen­sa­bi­le per l’am­mi­ni­stra­zio­ne del sistema. Dal controllo dell’avvio alla per­so­na­liz­za­zio­ne 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 di­stri­bu­zio­ni Linux e di­stri­bu­zio­ni Linux per i server come Ubuntu, Debian, Fedora, Red Hat En­ter­pri­se Linux (RHEL), CentOS, Arch Linux, Mageia o Gentoo, ma non è im­ple­men­ta­to uni­ver­sal­men­te in tutte le di­stri­bu­zio­ni.

Nell’eco­si­ste­ma systemd, systemctl svolge un ruolo centrale nella gestione dei servizi di sistema, nella con­fi­gu­ra­zio­ne, nel com­por­ta­men­to di avvio e nella ma­nu­ten­zio­ne. Le fun­zio­na­li­tà 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 prin­ci­pa­le del sistema init è quello di avviare i com­po­nen­ti necessari dopo l’avvio del kernel Linux (com­po­nen­ti “userland”). Inoltre, il sistema di init viene uti­liz­za­to per con­trol­la­re ef­fi­ca­ce­men­te i servizi e i demoni di un server in qualsiasi momento dell’ese­cu­zio­ne del sistema.

All’interno di systemd, la maggior parte dei processi è in­cen­tra­ta sulle co­sid­det­te unità, ossia risorse gestite da systemd. Queste unità sono clas­si­fi­ca­te in base al tipo di risorsa che rap­pre­sen­ta­no e sono definite dai co­sid­det­ti file unit. Il tipo di unità può essere ri­co­no­sciu­to dall’esten­sio­ne del file.

Nella gestione dei servizi, svolgono un ruolo fon­da­men­ta­le le unità di servizio che terminano con il suffisso .service. Spesso, però, non è ne­ces­sa­rio spe­ci­fi­ca­re questo suffisso per i comandi di gestione dei servizi, poiché nor­mal­men­te systemd è in grado di ri­co­no­sce­re che questi comandi si ri­fe­ri­sco­no a essi.

Avvio e in­ter­ru­zio­ne dei servizi

Le ope­ra­zio­ni più comuni eseguite tramite systemctl in Linux includono l’avvio e l’in­ter­ru­zio­ne dei servizi. Queste funzioni sono fon­da­men­ta­li per l’am­mi­ni­stra­zio­ne del sistema e per­met­to­no di mantenere il controllo sui processi in ese­cu­zio­ne. Per avviare un servizio, usa il comando start. Se stai lavorando come utente senza permessi di root, devi uti­liz­za­re sudo:

$ sudo systemctl start application.service
bash

Poiché systemd è pro­get­ta­to per cercare au­to­ma­ti­ca­men­te i file .service per i comandi di gestione dei servizi, il comando può essere inserito anche in forma sem­pli­fi­ca­ta:

$ 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 ese­cu­zio­ne, usa stop:

$ sudo systemctl stop application.service
bash
Server virtuali (VPS)
Affidati ai VPS e server di IONOS, il tuo partner digitale cer­ti­fi­ca­to ISO
  • 1 Gbps di larghezza di banda e traffico il­li­mi­ta­to
  • Di­spo­ni­bi­li­tà del 99,99% e cer­ti­fi­ca­zio­ne ISO
  • As­si­sten­za 24/7 e con­su­len­te personale

Riavviare e ri­ca­ri­ca­re

Per riavviare un servizio, ope­ra­zio­ne spesso ne­ces­sa­ria dopo una modifica delle con­fi­gu­ra­zio­ni, usa il comando restart:

$ sudo systemctl restart application.service
bash

Se l’ap­pli­ca­zio­ne in­te­res­sa­ta è in grado di ri­ca­ri­ca­re i file di con­fi­gu­ra­zio­ne senza riavviare, è possibile avviare questo processo uti­liz­zan­do il comando reload:

$ sudo systemctl reload application.service
bash

Se non sai con certezza se un servizio offre la pos­si­bi­li­tà di ri­ca­ri­ca­re la sua con­fi­gu­ra­zio­ne, puoi usare il comando reload-or-restart. Questo comando ricarica la con­fi­gu­ra­zio­ne se l’opzione è sup­por­ta­ta. Nel caso in cui non lo sia, il comando riavvia il servizio per applicare la con­fi­gu­ra­zio­ne ag­gior­na­ta.

$ sudo systemctl reload-or-restart application.service
bash

Attivare e di­sat­ti­va­re i servizi

Attivando e di­sat­ti­van­do i servizi, è possibile spe­ci­fi­ca­re se un servizio deve essere eseguito au­to­ma­ti­ca­men­te all’avvio del sistema. Si tratta di una funzione par­ti­co­lar­men­te utile per con­trol­la­re le pre­sta­zio­ni del sistema, oltre che per la gestione della sicurezza e delle di­pen­den­ze tra i diversi servizi. Per con­fi­gu­ra­re un servizio in modo che venga eseguito au­to­ma­ti­ca­men­te all’avvio del sistema, usa il comando enable:

$ sudo systemctl enable application.service
bash

All’ese­cu­zio­ne di questo processo, viene creato un col­le­ga­men­to simbolico. Questo col­le­ga­men­to 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 au­to­ma­ti­co, 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 au­to­ma­ti­ca­men­te all’avvio, usa il comando disable:

$ sudo systemctl disable application.service
bash

In questo modo viene eliminato il col­le­ga­men­to simbolico che in pre­ce­den­za spe­ci­fi­ca­va che il servizio doveva avviarsi au­to­ma­ti­ca­men­te. At­ten­zio­ne: la semplice at­ti­va­zio­ne di un servizio non comporta il suo avvio immediato nella sessione corrente. Per avviare im­me­dia­ta­men­te il servizio e con­fi­gu­rar­lo in modo che venga eseguito au­to­ma­ti­ca­men­te all’avvio, devi uti­liz­za­re sia il comando start che enable.

Ve­ri­fi­ca­re lo stato dei servizi

Con systemctl è possibile vi­sua­liz­za­re in­for­ma­zio­ni det­ta­glia­te sullo stato dei servizi. Questa funzione è utile per mo­ni­to­ra­re e dia­gno­sti­ca­re lo stato attuale dei servizi di sistema e delle ap­pli­ca­zio­ni. Per ef­fet­tua­re la verifica, utilizza il comando status:

$ systemctl status application.service
bash

Questo comando fornisce un’ampia gamma di in­for­ma­zio­ni, 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 ve­ri­fi­ca­re lo stato di attività di un servizio in Linux con systemctl uti­liz­zan­do is-active. Questo comando specifica se un servizio è at­tual­men­te 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 ve­ri­fi­ca­re se un servizio è con­fi­gu­ra­to per essere attivato au­to­ma­ti­ca­men­te all’avvio del sistema, puoi uti­liz­za­re il comando is-enabled, che risulta par­ti­co­lar­men­te utile per gestire la con­fi­gu­ra­zio­ne di avvio dei servizi su un sistema Linux.

$ systemctl is-enabled application.service
bash

Il comando indica se il servizio è attivato o di­sat­ti­va­to e imposta il codice di uscita a “0” o “1” in base alla risposta.

Il comando is-failed permette inoltre di ve­ri­fi­ca­re se uno specifico servizio presenta uno stato di errore:

$ systemctl is-failed application.service
bash

Se l’ese­cu­zio­ne ha esito positivo, viene emesso active, al­tri­men­ti viene vi­sua­liz­za­to failed. Se l’unità è stata arrestata in­ten­zio­nal­men­te, la risposta può essere unknown o inactive. Un valore di uscita di 0 segnala il ve­ri­fi­car­si di un errore, mentre 1 indica qualsiasi altro stato.

Pa­no­ra­mi­ca sullo stato del sistema

Finora abbiamo pre­sen­ta­to 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 esat­ta­men­te questo tipo di in­for­ma­zio­ni.

list-units è uno strumento utile per avere una pa­no­ra­mi­ca delle unità correnti su Linux:

$ systemctl list-units
bash

Una volta eseguito il comando, systemctl vi­sua­liz­za un elenco delle unità gestite da systemd. L’output di questo elenco contiene varie colonne con in­for­ma­zio­ni spe­ci­fi­che su ogni unità:

  • UNIT: il nome dell’unità, so­li­ta­men­te il nome del file unit cor­ri­spon­den­te, 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à su­bor­di­na­ta, che fornisce ulteriori dettagli sullo stato dell’unità; ad esempio, un’unità active potrebbe avere uno stato SUB di running, exited o failed.
  • DE­SCRIP­TION: una breve de­scri­zio­ne dell’unità, che spesso riflette lo scopo o la fun­zio­na­li­tà dell’unità.

Per im­po­sta­zio­ne pre­de­fi­ni­ta, però, il comando mostra solo le unità attive. Per questo motivo la colonna LOAD dell’output mostra ti­pi­ca­men­te loaded e la colonna ACTIVE active. Tramite flag ag­giun­ti­vi, systemctl può essere con­fi­gu­ra­to in modo da vi­sua­liz­za­re anche in­for­ma­zio­ni estese. Ad esempio, per vi­sua­liz­za­re tutte le unità caricate da systemd, in­di­pen­den­te­men­te dal loro stato di attività, puoi uti­liz­za­re il flag --all:

$ systemctl list-units --all
bash

L’output può essere ul­te­rior­men­te raffinato uti­liz­zan­do flag ag­giun­ti­vi come --state= per filtrare stati specifici nelle categorie LOAD, ACTIVE o SUB. Per vi­sua­liz­za­re anche le unità inattive è im­por­tan­te mantenere il flag --all:

$ systemctl list-units --all --state=inactive
bash

Puoi uti­liz­za­re inoltre il filtro --type= per vi­sua­liz­za­re esclu­si­va­men­te 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 vi­sua­liz­za­re 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 co­no­sciu­ti da systemd, compresi servizi, socket, target e altro ancora.

$ systemctl list-units-files
bash

Il comando vi­sua­liz­za i vari stati dei file unit, che indicano come sono con­fi­gu­ra­te le ri­spet­ti­ve unità, in par­ti­co­la­re per quanto riguarda il loro com­por­ta­men­to all’avvio del sistema. Gli stati più comuni sono i seguenti:

  • Enabled: l’unità è con­fi­gu­ra­ta in modo da essere attivata au­to­ma­ti­ca­men­te all’avvio del sistema.
  • Disabled: l’unità non è con­fi­gu­ra­ta per avviarsi au­to­ma­ti­ca­men­te durante il processo di boot.
  • Masked: l’unità è com­ple­ta­men­te di­sat­ti­va­ta in modo da non poter essere avviata né ma­nual­men­te né au­to­ma­ti­ca­men­te.
  • Static: l’unità non viene avviata in modo in­di­pen­den­te, ma ti­pi­ca­men­te dipende da un’altra unità e viene avviata solo in questo contesto.

Gestione delle unità

La gestione delle unità è uno dei compiti prin­ci­pa­li di systemctl. Per ottenere in­for­ma­zio­ni più spe­ci­fi­che sulle singole unità e per gestirle, systemctl offre una serie di comandi e opzioni utili.

Vi­sua­liz­za­re un file unit

Per vi­sua­liz­za­re il contenuto di uno specifico file unit di­ret­ta­men­te nella console, puoi uti­liz­za­re il comando cat. Ad esempio, per vi­sua­liz­za­re il file unit di un servizio come ssh.service, devi inserire:

$ systemctl cat ssh.service
bash

Vi­sua­liz­za­re le di­pen­den­ze

Le di­pen­den­ze di un’unità specifica possono essere vi­sua­liz­za­te come una struttura ad albero uti­liz­zan­do list-dependencies. Il comando si presenta in questo modo:

$ systemctl list-dependencies sshd.service
bash

Per im­po­sta­zio­ne pre­de­fi­ni­ta, le di­pen­den­ze vengono vi­sua­liz­za­te per le unità .target che rap­pre­sen­ta­no diversi stati del sistema. Per ottenere un elenco completo e ricorsivo di tutte le di­pen­den­ze, puoi uti­liz­za­re il flag --all.

Per vi­sua­liz­za­re le di­pen­den­ze inverse, cioè le unità che dipendono dall’unità spe­ci­fi­ca­ta, aggiungi --reverse al comando. Inoltre, i flag --before e --after ti per­met­to­no di vedere le di­pen­den­ze che iniziano prima o dopo l’unità in questione.

Applicare ed eliminare una maschera da un’unità

La ma­sche­ra­tu­ra di un’unità la di­sa­bi­li­ta in modo che non possa essere avviata né ma­nual­men­te né au­to­ma­ti­ca­men­te. Si usa spesso per garantire che un servizio o un’unità non vengano avviati ac­ci­den­tal­men­te o au­to­ma­ti­ca­men­te dalle di­pen­den­ze. La ma­sche­ra­tu­ra avviene creando un col­le­ga­men­to 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é ma­nual­men­te né au­to­ma­ti­ca­men­te mentre è in modalità di ma­sche­ra­tu­ra.

L’eli­mi­na­zio­ne della ma­sche­ra­tu­ra annulla lo stato di ma­sche­ra­tu­ra dell’unità, ren­den­do­la nuo­va­men­te avviabile. Il comando per eliminare la ma­sche­ra­tu­ra è unmask:

$ sudo systemctl unmask nginx.service
bash

Mo­di­fi­ca­re i file unit

systemctl dispone di opzioni per per­so­na­liz­za­re e mo­di­fi­ca­re i file unit. Questa fun­zio­na­li­tà è stata in­tro­dot­ta con la versione 218 di systemd. Uti­liz­zan­do il comando edit, viene aperto au­to­ma­ti­ca­men­te un file unit dell’unità se­le­zio­na­ta, pronto per essere mo­di­fi­ca­to:

$ sudo systemctl edit nginx.service
bash

Durante la modifica, viene creato un file vuoto per ag­giun­ge­re istru­zio­ni spe­ci­fi­che alla de­fi­ni­zio­ne di un’unità o mo­di­fi­car­le. Per ogni unità, ad esempio nginx.service, viene creata una sot­to­car­tel­la 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 sot­to­car­tel­la. Quando systemd carica l’unità, combina il contenuto di questo file snippet con il file unit originale, in modo che le istru­zio­ni dello snippet abbiano la priorità. Per elaborare l’intero file unit, è possibile uti­liz­za­re 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 mo­di­fi­ca­to in /etc/systemd/system.

Per annullare le modifiche apportate, puoi can­cel­la­re la directory di con­fi­gu­ra­zio­ne .d dell’unità o il file mo­di­fi­ca­to in /etc/systemd/system:

$ sudo rm -r /etc/systemd/system/nginx.service.d
bash

Con il seguente comando è possibile eliminare un file unit com­ple­ta­men­te re­vi­sio­na­to:

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

Dopo aver rimosso il file o la directory, è ne­ces­sa­rio ri­ca­ri­ca­re systemd in modo che smetta di fare ri­fe­ri­men­to ai file eliminati e torni alla copia del sistema:

$ sudo systemctl daemon-reload
bash

Per­so­na­liz­za­re lo stato del sistema (runlevel) con i target

I target in systemd sono uti­liz­za­ti prin­ci­pal­men­te per rag­grup­pa­re diverse unità al fine di rea­liz­za­re specifici stati del sistema, in modo simile ai runlevel di altri sistemi init. I file con il suffisso .target fungono da punti di ri­fe­ri­men­to che indicano lo stato di di­spo­ni­bi­li­tà di de­ter­mi­na­te funzioni, in modo che l’utente possa spe­ci­fi­ca­re lo stato generale de­si­de­ra­to invece delle singole unità richieste.

Un esempio pratico è rap­pre­sen­ta­to da swap.target, che indica lo stato di pre­pa­ra­zio­ne allo swap. Le unità che sono coinvolte nel processo di swap possono sin­cro­niz­zar­si con questo target uti­liz­zan­do opzioni di con­fi­gu­ra­zio­ne come WantedBy= o RequiredBy=. Le unità che dipendono da swap, invece, possono indicarlo con im­po­sta­zio­ni come Wants=, Requires= e After= per esprimere la loro di­pen­den­za e la sequenza di avvio rispetto a swap.

Recupero e im­po­sta­zio­ne del target pre­de­fi­ni­to

Re­cu­pe­ra­re e impostare il target pre­de­fi­ni­to ti permette di definire uno stato di sistema pre­de­fi­ni­to che il tuo sistema deve rag­giun­ge­re all’avvio. Di seguito il comando per trovare il target pre­de­fi­ni­to per il tuo sistema:

$ systemctl get-default
Output
multi-user.target
bash

Per cambiare il target pre­de­fi­ni­to, usa il comando set-default insieme al nome del target. Il seguente comando consente di impostare la de­sti­na­zio­ne pre­de­fi­ni­ta su graphical.target, avviando un’in­ter­fac­cia utente grafica:

$ sudo systemctl set-default graphical.target
bash

Elenco dei target di­spo­ni­bi­li

Per ottenere un elenco di tutti i target di­spo­ni­bi­li sul tuo sistema, puoi uti­liz­za­re il seguente comando:

$ systemctl list-unit-files --type=target
bash

In questo modo viene vi­sua­liz­za­to un elenco di tutti i file unit target in­stal­la­ti sul sistema. Per ogni target vengono vi­sua­liz­za­ti il percorso e lo stato attuale (ad esempio, attivato o di­sat­ti­va­to).

Isolare i target

Con isolate puoi attivare tutte le unità che sono collegate a un target specifico e allo stesso tempo in­ter­rom­pe­re tutte le unità che non sono collegate a esso.

Sup­po­nia­mo che tu stia lavorando in un ambiente con il graphical.target attivo e voglia passare a una modalità mul­tiu­ten­te pura senza in­ter­fac­cia grafica. In questo caso, puoi di­sat­ti­va­re 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 in­ter­rot­ti al momento del passaggio.

In ogni caso, prima di isolare un obiettivo, è opportuno ve­ri­fi­ca­re le di­pen­den­ze associate. In questo modo eviterai l’arresto in­vo­lon­ta­rio di processi im­por­tan­ti.

$ systemctl list-dependencies multi-user.target
bash

Una volta che hai ve­ri­fi­ca­to e approvato le unità attive che desideri mantenere, puoi isolare la de­sti­na­zio­ne de­si­de­ra­ta:

$ sudo systemctl isolate multi-user.target
bash

Uti­liz­za­re le scor­cia­to­ie per gli eventi im­por­tan­ti

Esistono target specifici per ope­ra­zio­ni basilari come lo spe­gni­men­to o il riavvio del sistema. In Linux, però, systemctl offre anche pratiche scor­cia­to­ie per funzioni ag­giun­ti­ve. Ad esempio, per mettere il sistema in modalità di sal­va­tag­gio (single user mode), puoi sem­pli­ce­men­te usare rescue invece di isolate rescue.target:

$ sudo systemctl rescue
bash

Puoi arrestare il sistema con halt:

$ sudo systemctl halt
bash

Puoi avviare uno spe­gni­men­to completo con poweroff:

$ sudo systemctl poweroff
bash

Per riavviare il sistema, invece, puoi uti­liz­za­re reboot:

$ sudo systemctl reboot
bash

Questi comandi informano le persone connesse sugli eventi imminenti, cosa che non può essere ottenuta con la semplice ese­cu­zio­ne o iso­la­men­to del target. È im­por­tan­te sapere che molti computer collegano i comandi più brevi per queste azioni con systemd per as­si­cu­rar­ne la corretta ese­cu­zio­ne.

Per riavviare il sistema, so­li­ta­men­te è suf­fi­cien­te il seguente comando:

$ sudo reboot
bash
Vai al menu prin­ci­pa­le