Service Management in Systemd

Copre i workflow systemctl per l'avvio, l'abilitazione, il monitoraggio e la personalizzazione dei servizi systemd.

I servizi in un sistema Oracle Linux sono gestiti dal comando systemctl subcommand.

Esempi di comandi secondari sono enable, disable, stop, start, restart, reload e status.

Per ulteriori informazioni, vedere la pagina del manuale systemctl(1).

Avvio e arresto dei servizi

Mostra i comandi di base systemctl start e systemctl stop e spiega come persistono le modifiche allo stato.

Per avviare un servizio, utilizzare il comando systemctl start:

sudo systemctl start sshd

Per arrestare un servizio, utilizzare il comando systemctl stop:

sudo systemctl stop sshd

La modifica dello stato di un servizio dura solo mentre il sistema rimane allo stesso stato.

Se si arresta un servizio e quindi si modifica la destinazione dello stato del sistema su una destinazione in cui il servizio è configurato per l'esecuzione (ad esempio, effettuando il reboot del sistema), il servizio viene riavviato. Analogamente, l'avvio di un servizio non consente al servizio di avviarsi dopo un riavvio. Vedere Abilitazione e disabilitazione dei servizi.

Abilitazione e disabilitazione dei servizi

Spiega come abilitare, disabilitare, mascherare e annullare la maschera dei servizi in modo che inizino (o rimangano fermati) durante il reboot.

È possibile utilizzare il comando systemctl per abilitare o disabilitare un servizio all'avvio al boot del sistema, ad esempio:

sudo systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

Il comando enable attiva un servizio creando un collegamento simbolico per la destinazione di stato del sistema di livello inferiore alla quale viene avviato il servizio. Nell'esempio precedente, il comando crea il collegamento simbolico httpd.service per la destinazione multi-user.

Nota

Per avviare il servizio contemporaneamente all'abilitazione, includere l'opzione --now nel comando. Ad esempio: sudo systemctl enable --now httpd

La disabilitazione di un servizio rimuove il collegamento simbolico:

sudo systemctl disable httpd
Removed /etc/systemd/system/multi-user.target.wants/httpd.service.

Per verificare se un servizio è abilitato, utilizzare il comando secondario is-enabled come illustrato negli esempi seguenti:

systemctl is-enabled httpd
disabled
systemctl is-enabled sshd
enabled

Dopo aver eseguito il comando systemctl disable, il servizio può comunque essere avviato o interrotto da account utente, script e altri processi.

Tuttavia, se è necessario assicurarsi che il servizio non possa essere avviato inavvertitamente, ad esempio da un servizio in conflitto, utilizzare il comando systemctl mask come indicato di seguito.

sudo systemctl mask httpd
Created symlink from '/etc/systemd/system/multi-user.target.wants/httpd.service' to '/dev/null'

Il comando mask imposta il riferimento al servizio su /dev/null. Se si tenta di avviare un servizio mascherato, si riceverà un errore come mostrato nell'esempio seguente:

sudo systemctl start httpd
Failed to start httpd.service: Unit is masked.

Per ricollegare il riferimento al servizio al file di configurazione dell'unità di servizio corrispondente, utilizzare il comando systemctl unmask:

sudo systemctl unmask httpd

Per ulteriori informazioni, vedere la pagina del manuale systemctl(1).

Visualizzazione dello stato di un servizio

Dettagli dei comandi systemctl is-active e status per il controllo dell'integrità del servizio e dei gruppi di controllo.

Per verificare se un servizio è in esecuzione, utilizzare il comando secondario is-active. L'output sarebbe attivo o inattivo, come mostrato negli esempi riportati di seguito.

systemctl is-active httpd
active
systemctl is-active sshd
inactive

Il comando secondario status fornisce un riepilogo dettagliato dello stato di un servizio, incluso un albero che visualizza i task nel gruppo di controllo (CGroup) implementato dal servizio:

systemctl status httpd
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since ...
     Docs: man:httpd.service(8)
 Main PID: 11832 (httpd)
   Status: "Started, listening on: port 80"
    Tasks: 213 (limit: 26213)
   Memory: 32.5M
   CGroup: /system.slice/httpd.service
           ├─11832 /usr/sbin/httpd -DFOREGROUND
           ├─11833 /usr/sbin/httpd -DFOREGROUND
           ├─11834 /usr/sbin/httpd -DFOREGROUND
           ├─11835 /usr/sbin/httpd -DFOREGROUND
           └─11836 /usr/sbin/httpd -DFOREGROUND

Jul 17 00:14:32 Unknown systemd[1]: Starting The Apache HTTP Server...
Jul 17 00:14:32 Unknown httpd[11832]: Server configured, listening on: port 80
Jul 17 00:14:32 Unknown systemd[1]: Started The Apache HTTP Server.

Un cgroup è una raccolta di processi associati tra loro in modo da poter controllare l'accesso alle risorse di sistema. Nell'esempio, cgroup per il servizio httpd è httpd.service, che si trova nella slice system.

Le slice dividono cgroups in un sistema in categorie diverse. Per visualizzare la slice e la struttura gerarchica cgroup, utilizzare il comando systemd-cgls.

systemd-cgls
Control group /:
-.slice
├─user.slice
│ └─user-1000.slice
│   ├─user@1000.service
│   │ └─init.scope
│   │   ├─6488 /usr/lib/systemd/systemd --user
│   │   └─6492 (sd-pam)
│   └─session-7.scope
│     ├─6484 sshd: root [priv]
│     ├─6498 sshd: root@pts/0
│     ├─6499 -bash
│     ├─6524 sudo systemd-cgls
│     ├─6526 systemd-cgls
│     └─6527 less
├─init.scope
│ └─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 16
└─system.slice
  ├─rngd.service
  │ └─1266 /sbin/rngd -f --fill-watermark=0
  ├─irqbalance.service
  │ └─1247 /usr/sbin/irqbalance --foreground
  ├─libstoragemgmt.service
  │ └─1201 /usr/bin/lsmd -d
  ├─systemd-udevd.service
  │ └─1060 /usr/lib/systemd/systemd-udevd
  ├─polkit.service
  │ └─1241 /usr/lib/polkit-1/polkitd --no-debug
  ├─chronyd.service
  │ └─1249 /usr/sbin/chronyd
  ├─auditd.service
  │ ├─1152 /sbin/auditd
  │ └─1154 /usr/sbin/sedispatch
  ├─tuned.service
  │ └─1382 /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P
  ├─systemd-journald.service
  │ └─1027 /usr/lib/systemd/systemd-journald
  ├─atd.service
  │ └─1812 /usr/sbin/atd -f
  ├─sshd.service
  │ └─1781 /usr/sbin/sshd

system.slice contiene servizi e altri processi di sistema. user.slice contiene processi utente che vengono eseguiti all'interno di cgroup transitori denominati scopi.

Nell'esempio, i processi per l'utente con ID 1000 vengono eseguiti nell'ambito session-7.scope nella slice /user.slice/user-1000.slice.

È possibile utilizzare il comando systemctl per limitare la CPU, l'I/O, la memoria e altre risorse disponibili per i processi nei cgroup di servizi e di ambito. Vedere Controllo dell'accesso alle risorse di sistema.

Per ulteriori informazioni, vedere le pagine del manuale systemctl(1) e systemd-cgls(1). Vedere anche Utilizzo di Systemd per la gestione dei gruppi di controllo.

Controllo dell'accesso alle risorse di sistema

Mostra come utilizzare systemctl set-property e systemd-run per assegnare limiti di CPU e memoria a servizi e ambiti.

Utilizzare il comando systemctl per controllare l'accesso di un cgroup alle risorse di sistema, ad esempio:

sudo systemctl [--runtime] set-property httpd CPUShares=512 MemoryLimit=1G

CPUShare controlla l'accesso alle risorse CPU. Poiché il valore predefinito è 1024, un valore pari a 512 dimezza l'accesso al tempo CPU di cui dispongono i processi in cgroup. Analogamente, MemoryLimit controlla la quantità massima di memoria che può essere utilizzata da cgroup.

Nota

Non è necessario specificare l'estensione .service per il nome di un servizio.

Se si specifica l'opzione --runtime, l'impostazione non persiste tra i reboot del sistema.

In alternativa, è possibile modificare le impostazioni delle risorse per un servizio sotto l'intestazione [Service] nel file di configurazione del servizio in /usr/lib/systemd/system. Dopo aver modificato il file, fare in modo che systemd ricarichi i file di configurazione e quindi riavviare il servizio:

sudo systemctl daemon-reload
sudo systemctl restart service

È possibile eseguire comandi generali all'interno degli ambiti e utilizzare systemctl per controllare l'accesso di questi cgroup transitori alle risorse di sistema. Per eseguire un comando incluso in un ambito, utilizzare il comando systemd-run:

sudo systemd-run --scope --unit=group_name.scope [--slice=slice_name]

Se non si desidera creare il gruppo sotto la slice system predefinita, è possibile specificare un'altra slice o il nome di una nuova slice. L'esempio seguente esegue un comando denominato mymonitor in mymon.scope sotto myslice.slice:

sudo systemd-run --scope --unit=mymon.scope --slice=myslice mymonitor
Running as unit mymon.scope.
Nota

Se non si specifica l'opzione --scope, il gruppo di controllo è creato come servizio anziché come ambito.

È quindi possibile utilizzare systemctl per controllare l'accesso di un ambito alle risorse di sistema allo stesso modo di un servizio. Tuttavia, a differenza di un servizio, è necessario specificare l'estensione .scope, ad esempio:

sudo systemctl --runtime set-property mymon.scope CPUShares=256

Per ulteriori informazioni, vedere Utilizzo di Systemd per la gestione dei gruppi di controllo e le pagine del manuale systemctl(1), systemd-cgls(1) e systemd.resource-control(5).

Creazione di un servizio systemd basato sull'utente

Oltre ai file systemd a livello di sistema, systemd consente di creare servizi basati sugli utenti che è possibile eseguire a livello di utente senza richiedere accesso root e privilegi. Questi servizi basati sull'utente sono controllati dall'utente e sono configurabili indipendentemente dai servizi di sistema.

Di seguito sono riportate alcune caratteristiche distintive dei servizi systemd basati sull'utente.

  • I servizi systemd basati sull'utente sono collegati a un account utente specifico.
  • Vengono create nella directory home dell'utente associato in $HOME/.config/systemd/user/.
  • Una volta abilitati, questi servizi vengono avviati quando l'utente associato esegue il login. Questo comportamento è diverso da quello dei servizi systemd attivati, che vengono avviati al boot del sistema.

Questa funzione è particolarmente utile quando si creano servizi contenitore Podman. Per ulteriori informazioni su Podman, vedere Oracle Linux: Podman User's Guide.

Per creare un servizio basato sull'utente, effettuare le operazioni seguenti.

  1. Creare il file di unità del servizio nella directory $HOME/.config/systemd/user, ad esempio:
    touch $HOME/.config/systemd/user/myservice.service
  2. Aprire il file di unità e specificare i valori per le opzioni che si desidera utilizzare, ad esempio Description, ExecStart, WantedBy e così via.
    Per riferimento, vedere Opzioni configurabili nei file delle unità di servizio e le pagine del manuale systemd.service(5) e systemd.unit(5).
  3. Abilitare l'avvio automatico del servizio al momento del login.
    systemctl --user enable myservice.service
    Nota

    Quando si esegue il logout, il servizio viene arrestato a meno che l'utente root non abbia abilitato i processi per continuare l'esecuzione per l'utente.

    Per ulteriori informazioni, vedere https://docs.oracle.com/en/learn/ol-systemd/.

  4. Avviare il servizio.
    systemctl --user start myservice.service
  5. Verificare che il servizio sia in esecuzione.
    systemctl --user status myservice.service

Modifica dei file systemd delle unità di servizio

Descrive come eseguire l'override dei file delle unità pacchettizzate e creare snippet drop-in in /etc/systemd/system.

Per modificare la configurazione dei servizi systemd, copiare i file con le estensioni .service, .target, .mount e .socket da /usr/lib/systemd/system a /etc/systemd/system.

Dopo aver copiato i file, è possibile modificare le versioni in /etc/systemd/system.

I file in /etc/systemd/system hanno la precedenza sulle versioni in /usr/lib/systemd/system. I file in /etc/systemd/system non vengono sovrascritti quando si aggiorna un pacchetto che tocca i file in /usr/lib/systemd/system.

Per ripristinare la configurazione systemd predefinita per un determinato servizio, è possibile rinominare o eliminare le copie in /etc/systemd/system.

Un altro approccio per modificare la configurazione di un servizio è quello di creare un file drop-in. Con questo approccio, è possibile conservare l'unità originale modificando parametri specifici dell'unità.

Creare file drop-in in /etc/systemd/system/unit_name.d/, dove la directory unit_name.d è un'unità esistente, quindi assegnare ai file drop-in un'estensione di file .conf.

Ad esempio: /etc/systemd/system/unit_name.d/name_of_drop-in.conf. systemd legge il file .conf e applica le impostazioni all'unità originale.

Le sezioni seguenti descrivono le diverse parti di un file di unità di servizio che è possibile modificare e personalizzare per un sistema.

Informazioni sui file delle unità di servizio

I servizi vengono eseguiti in base ai file delle unità di servizio corrispondenti. Un file di unità di servizio in genere contiene le sezioni riportate di seguito, con ciascuna sezione con le rispettive opzioni definite che determinano la modalità di esecuzione di un servizio specifico.

[Unit]

Contiene informazioni sul servizio.

[UnitType]:

Contiene opzioni specifiche per il tipo di unità del file. Ad esempio, in un file dell'unità di servizio questa sezione è denominata [Service] e contiene opzioni specifiche per le unità del tipo di servizio, ad esempio ExecStart o StandardOutput.

Solo i tipi di unità che offrono opzioni specifiche per il loro tipo dispongono di tale sezione.

[Install]

Contiene informazioni di installazione per l'unità specifica. Le informazioni di questa sezione vengono utilizzate dai comandi systemctl enable e systemctl disable.

Un file di unità di servizio può contenere le seguenti configurazioni per un servizio.

[Unit]
Description=A test service used to develop a service unit file template

[Service]
Type=simple
StandardOutput=journal
ExecStart=/usr/lib/systemd/helloworld.sh

[Install]
WantedBy=default.target

In Opzioni configurabili nei file delle unità di servizio vengono descritte alcune opzioni configurate di uso comune disponibili in ciascuna sezione. Un elenco completo è disponibile anche nelle pagine del manuale systemd.service(5) e systemd.unit(5).

Opzioni configurabili nei file delle unità di servizio

Ciascuno dei seguenti elenchi riguarda una sezione separata del file dell'unità di servizio.

Descrizione delle opzioni nella sezione [Unità]

L'elenco seguente fornisce una panoramica generale delle opzioni configurabili di uso comune disponibili nella sezione [Unit] del file dell'unità di servizio.

Description

Fornisce informazioni sul servizio. Le informazioni vengono visualizzate quando si esegue il comando systemctl status sull'unità.

Documentation

Contiene una lista separata da spazi di URI che fanno riferimento alla documentazione per questa unità o la relativa configurazione.

After

Configura l'esecuzione dell'unità solo dopo l'avvio delle unità elencate nell'opzione.

Nell'esempio seguente, se il file var3.service contiene la voce seguente, viene avviato solo dopo l'avvio delle unità var1.service e var2.service:

 After=var1.service var2.service
Requires

Consente di configurare un'unità in modo che disponga delle dipendenze dei requisiti su altre unità. Se viene attivata un'unità, vengono attivate anche quelle elencate nell'opzione Requires.

Wants

Versione meno rigorosa dell'opzione Requires. Ad esempio, è possibile attivare un'unità specifica anche se l'avvio di una di quelle elencate nell'opzione Wants non riesce.

Descrizione delle opzioni nella sezione [Servizio]

L'elenco seguente fornisce una panoramica generale delle opzioni configurabili di uso comune disponibili nella sezione [Service] di un file di unità di servizio.

Type

Configura il tipo di avvio del processo per l'unità di servizio.

Per impostazione predefinita, il valore del parametro è simple, che indica che il processo principale del servizio è quello avviato dal parametro ExecStart.

In genere, se il tipo di servizio è simple, la definizione può essere omessa dal file.

StandardOutput
Consente di configurare la modalità di registrazione degli eventi del servizio. Ad esempio, si consideri che il file di un'unità di servizio contiene la voce seguente:
StandardOutput=journal

Nell'esempio, il valore journal indica che gli eventi vengono registrati nel giornale, che può essere visualizzato utilizzando il comando journalctl.

ExecStart

Specifica il percorso e il comando completi che avviano il servizio, ad esempio /usr/bin/npm start.

ExecStop

Specifica i comandi da eseguire per arrestare il servizio avviato tramite ExecStart.

ExecReload

Specifica i comandi da eseguire per attivare un ricaricamento della configurazione nel servizio.

Restart

Configura se il servizio deve essere riavviato quando il processo di servizio viene interrotto, arrestato o quando viene raggiunto un timeout.

Nota

Questa opzione non si applica quando il processo viene arrestato in modo pulito da un'operazione systemd, ad esempio systemctl stop o systemctl restart. In questi casi, il servizio non viene riavviato da questa opzione di configurazione.
RemainAfterExit

Valore booleano che configura se il servizio deve essere considerato attivo anche dopo l'uscita di tutti i relativi processi. Il valore predefinito è no.

Descrizione delle opzioni nella sezione [Installa]

L'elenco seguente fornisce una panoramica generale delle opzioni configurabili di uso comune disponibili nella sezione [Install] del file dell'unità di servizio.

Alias

Elenco separato da spazi di nomi per un'unità.

Al momento dell'installazione, systemctl enable crea collegamenti simbolici da questi nomi al nome file dell'unità.

Gli alias sono validi solo quando l'unità è abilitata.

RequiredBy

Consente di configurare il servizio come richiesto da altre unità.

Ad esempio, si consideri un file di unità var1.service a cui è stata aggiunta la seguente configurazione:

RequiredBy=var2.service var3.service

Quando var1.service è abilitato, a var2.service e a var3.service viene concessa una dipendenza Requires da var1.service. Questa dipendenza è definita da un collegamento simbolico creato nella cartella .requires di ogni servizio dipendente (var2.service e var3.service) che punta al file di unità di sistema var1.service.

WantedBy

Specifica una lista di unità a cui deve essere concessa una dipendenza wants dal servizio di cui si sta modificando il file.

Ad esempio, si consideri un file di unità var1.service a cui è stata aggiunta la seguente configurazione:

WantedBy=var2.service var3.service

Quando var1.service è abilitato, sia var2.service che var3.service ricevono una dipendenza Wants da var1.service. Questa dipendenza è definita da un collegamento simbolico creato nella cartella ".wants" di ogni servizio dipendente (var2.service e var3.service) che punta al file di unità di sistema per var1.service.

Also

Elenca le unità aggiuntive da installare o rimuovere quando l'unità viene installata o rimossa.

DefaultInstance

L'opzione DefaultInstance si applica solo ai file di unità del modello.

I file di unità modello consentono la creazione di più unità da un singolo file di configurazione. L'opzione DefaultInstance specifica l'istanza per la quale l'unità è abilitata se il modello è abilitato senza alcuna istanza impostata in modo esplicito.

Creazione di un file drop-in unità

È possibile utilizzare il comando systemctl edit per generare automaticamente un file drop-in o unit di un'unità systemd per qualsiasi unità systemd esistente. È possibile utilizzare il file di rilascio per eseguire l'override della configurazione di base per un'unità o per estendere i requisiti per un file di unità.

  1. Eseguire il comando systemctl edit <unit> per generare automaticamente un file drop-in systemd e per aprire il file nell'editor predefinito di sistema.

    Ad esempio, per modificare l'unità cockpit.socket per modificare la porta ascoltata dalla console Web Cockpit, è possibile effettuare le operazioni riportate di seguito.

    sudo systemctl edit cockpit.socket --drop-in=listen.conf

    L'opzione --drop-in consente di specificare il nome del file utilizzato per il file di rilascio. Se non si specifica questa opzione, il nome file predefinito viene impostato su override.conf.

    Viene visualizzato l'editor di testo del sistema ed è possibile aggiungere le righe per eseguire l'override della configurazione predefinita:

    [Socket]
    ListenStream=
    ListenStream=443
    Nota

    Se si modifica la porta listener predefinita per Cockpit, è necessaria un'ulteriore configurazione al di fuori di systemd. Ad esempio, potrebbe essere necessario modificare i contesti SELinux e la configurazione del firewall.
  2. Salvare il file di rilascio o uscire.
    Se si salvano le modifiche apportate al file di rilascio, il file viene installato automaticamente in /etc/systemd/system/<unit>.d/<drop-in.file>. Se si esce dall'editor senza salvare le modifiche, il file non viene creato e non sono necessari ulteriori aggiornamenti.
  3. Ricaricare la configurazione del daemon systemd.
    sudo systemctl daemon-reload
  4. Riavviare l'unità systemd aggiornata.

    Ad esempio, per riavviare il file cockpit.socket utilizzato in questo esempio, eseguire:

    sudo systemctl restart cockpit.socket