Utilizzo dei timer in Systemd
Spiega come funziona la pianificazione delle unità timer sistemate e come configurare timer in tempo reale, monotoni e transitori.
I file di unità timer sono un tipo di file systemd utilizzato dalla utility systemctl per pianificare i task, in modo simile alla utility cron che utilizza crontab e altri job cron per lo stesso scopo.
Si noti che il daemon cron viene eseguito come servizio all'interno di systemd, quindi le unità timer sono preferite perché rimuovono un livello di elaborazione aggiunta e offrono molta più utilità e configurazione più granulare di quella disponibile nel servizio cron.
In genere, i pacchetti che utilizzano servizi specifici per funzionare nel sistema includono i propri file di unità timer systemd. Pertanto, quando questi pacchetti vengono installati con Oracle Linux, i file dell'unità timer vengono inclusi automaticamente. È possibile visualizzare i file timer sul sistema con il seguente comando:
systemctl list-unit-files --type=timer
La lista dei file timer può variare a seconda della posizione in cui Oracle Linux è in esecuzione, ad esempio in un'istanza di Oracle Cloud Infrastructure, in un sistema fisico e così via.
Ogni file di unità timer contiene le impostazioni dei parametri che gestiscono la pianificazione di un task. Ad esempio, la pianificazione per l'esecuzione di dnf-makecache.service viene impostata nel file dnf-makecache.timer. Il file contiene le impostazioni riportate di seguito.
systemctl cat dnf-makecache.timer
# /usr/lib/systemd/system/dnf-makecache.timer
[Unit]
Description=dnf makecache --timer
ConditionKernelCommandLine=!rd.live.image
# See comment in dnf-makecache.service
ConditionPathExists=!/run/ostree-booted
Wants=network-online.target
[Timer]
OnBootSec=10min
OnUnitInactiveSec=1h
RandomizedDelaySec=60m
Unit=dnf-makecache.service
[Install]
WantedBy=timers.target
Le informazioni sulla pianificazione vengono specificate nella sezione [Timer].
Nella configurazione di esempio, il servizio dnf-makecache.service viene impostato per essere eseguito automaticamente 10 minuti dopo il boot del sistema. Il servizio passa quindi in modalità di inattività per un'ora, come specificato dal parametro OnUnitInactiveSec. Alla fine dell'ora, il servizio viene eseguito di nuovo. Questo ciclo continua ogni ora indefinitamente.
L'impostazione RandomizedDelaySec fornisce un limite di valore per il ritardo di un'esecuzione oltre la pianificazione.
Nell'esempio, l'esecuzione del servizio è consentita al più tardi un minuto dopo la pianificazione. Questo parametro è utile per evitare troppi job che iniziano contemporaneamente in una pianificazione specificata, altrimenti rischierebbe di sovraccaricare le risorse.
OnCalendar è un altro parametro utile per la pianificazione dei task. Si supponga che il parametro sia impostato come indicato di seguito.
OnCalendar=*:00/10
*:00 indica ogni ora nella parte superiore dell'ora, mentre l'impostazione /10 indica 10 minuti. Pertanto, il job è impostato per essere eseguito ogni ora, a dieci minuti dall'inizio dell'ora.
Per un elenco completo dei parametri del file delle unità timer systemd per la pianificazione di un job, vedere le pagine del manuale systemd.timer(5).
Per un'esercitazione su come utilizzare
systemd in Oracle Linux, incluso come configurare i file delle unità timer systemd, vedere https://docs.oracle.com/en/learn/ol-systemd/.Utilizzo di unità timer per controllare runtime unità servizio
Spiega come le unità timer sostituiscono i cron job e come ispezionare, abilitare e monitorare i servizi attivati dal timer.
Le unità timer possono essere configurate per controllare quando vengono eseguite le unità di servizio.
È possibile utilizzare unità timer invece di configurare il daemon cron per gli eventi basati sul tempo. Le unità timer possono essere più complesse da configurare rispetto alla creazione di una voce crontab. Tuttavia, le unità timer sono più configurabili e i servizi che controllano possono essere configurati per una migliore registrazione e un'integrazione più profonda con l'architettura systemd.
Le unità timer vengono avviate, abilitate e arrestate in modo simile alle unità di servizio. Ad esempio, per abilitare e avviare immediatamente un'unità timer, digitare:
sudo systemctl enable --now myscript.timer
Per elencare tutti i timer esistenti nel sistema, per vedere l'ultima esecuzione e la successiva configurazione per l'esecuzione, digitare:
systemctl list-timers
Per ulteriori informazioni sui timer di sistema, vedere le pagine del manuale systemd.timer(5) e systemd.time(7).
Configurazione di un'unità timer in tempo reale
I timer in tempo reale vengono attivati in un evento di calendario, in modo simile agli eventi in un crontab. L'opzione OnCalendar specifica quando il timer esegue un servizio.
-
Se necessario, creare un file
.serviceche definisca il servizio da attivare dall'unità timer. Nella procedura seguente, il servizio di esempio è/etc/systemd/system/update.service, che è un'unità di servizio che esegue uno script di aggiornamento.Per ulteriori informazioni sulla creazione delle unità di servizio, vedere Creazione di un servizio systemd basato sull'utente.
-
Decidere l'ora e la frequenza di esecuzione del servizio. In questa procedura, il timer viene configurato per eseguire il servizio ogni 2 ore dal lunedì al venerdì.
Questo task mostra come creare un timer di sistema per attivare un servizio da eseguire in base a un evento di calendario. La definizione dell'evento di calendario è simile a quella delle voci inserite in un lavoro cron.
Configurazione di un'unità di timer monotona
I timer monotonici vengono attivati dopo un intervallo di tempo relativo a un punto di partenza variabile, ad esempio un evento di boot, o quando una particolare unità systemd diventa attiva. Queste unità timer si arrestano se il computer è temporaneamente sospeso o spento. I timer monotonici vengono configurati utilizzando l'opzione OnTypeSec, dove Type è il nome dell'evento a cui è correlato il timer. I timer monotoni comuni includono OnBootSec e OnUnitActiveSec.
-
Se necessario, creare un file
.serviceche definisca il servizio da attivare dall'unità timer. Nella procedura seguente, il servizio di esempio è/etc/systemd/system/update.service, che è un'unità di servizio che esegue uno script di aggiornamento.Per ulteriori informazioni sulla creazione delle unità di servizio, vedere Creazione di un servizio systemd basato sull'utente.
-
Decidere l'ora e la frequenza di esecuzione del servizio. In questa procedura, il timer viene configurato per eseguire il servizio 10 minuti dopo il boot del sistema e ogni 2 ore dall'ultima attivazione del servizio.
Questa attività mostra come creare un timer di sistema per attivare un servizio da eseguire in occasione di eventi specifici, ovvero quando il sistema si avvia o dopo 2 ore sono scaduti dall'attivazione del timer.
Esecuzione di un'unità timer transitorio
Dimostra come avviare timer una tantum con systemctl run in modo da poter pianificare attività ad hoc senza creare file di unità.
I timer transitori sono timer temporanei validi solo per la sessione corrente.
Questi timer possono essere creati per eseguire direttamente un programma o uno script senza richiedere che le unità di servizio o timer vengano configurate all'interno di systemd. Queste unità vengono generate utilizzando il comando systemd-run. Per ulteriori informazioni, consultare la pagina del manuale systemd-run(1).
Le opzioni di parametro che si desidera aggiungere al file unit-file.timer fungono anche da argomenti quando si utilizza il comando systemd-run per eseguire un'unità timer transitoria.
Gli esempi riportati di seguito mostrano come utilizzare systemd-run per attivare i timer transitori.
-
Eseguire
update.servicedopo 2 ore.sudo systemd-run --on-active="2h" --unit update.service -
Creare
~/tmp/myfiledopo 1 ora.sudo systemd-run --on-active="1h" /bin/touch ~/tmp/myfile -
Eseguire
~/myscripts/update.sh5 minuti dopo l'avvio del Service Manager. Utilizzare questa sintassi per eseguire un servizio dopo l'avvio di Service Manager al login dell'utente.sudo systemd-run --on-startup="5m" ~/myscripts/update.sh -
Eseguire
myjob.service10 minuti dopo il boot del sistema.sudo systemd-run --on-boot="10m" --unit myjob.service -
Eseguire
report.servicea fine giornata.sudo systemd-run --on-calendar="17:00:00"