Utilisation des minuteries dans Systemd

Explique comment les unités de minuterie programmées fonctionnent et comment configurer les minuteries en temps réel, monotones et transitoires.

Les fichiers d'unité de temporisateur sont un type de fichier systemd que l'utilitaire systemctl utilise pour programmer des tâches, comme l'utilitaire cron qui utilise crontab et d'autres tâches cron à la même fin.

Notez que le démon cron s'exécute en tant que service dans systemd, de sorte que les unités de minuterie sont préférées car elles suppriment une couche de traitement supplémentaire et offrent beaucoup plus d'utilité et une configuration plus granulaire que celle disponible dans le service cron.

En général, les packages qui utilisent des services spécifiques pour fonctionner dans le système incluent leurs propres fichiers d'unité de temporisateur systemd. Ainsi, lorsque ces ensembles sont installés avec Oracle Linux, les fichiers d'unité de minuterie sont automatiquement inclus. Vous pouvez afficher les fichiers de temporisateur sur le système à l'aide de la commande suivante :

systemctl list-unit-files --type=timer
Note

La liste des fichiers de temporisateur peut varier selon l'endroit où Oracle Linux est exécuté, par exemple dans une instance d'Oracle Cloud Infrastructure, un système physique, etc.

Chaque fichier d'unité de minuterie contient des paramètres qui gèrent la planification d'une tâche. Par exemple, la programmation de l'exécution de dnf-makecache.service est définie dans le fichier dnf-makecache.timer. Le fichier contient les paramètres suivants :

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

Les informations sur la programmation sont spécifiées dans la section [Timer].

Dans l'exemple de configuration, le service dnf-makecache.service est réglé pour s'exécuter automatiquement 10 minutes après le démarrage du système. Le service passe ensuite en mode inactif pendant une heure, comme spécifié par le paramètre OnUnitInactiveSec. À la fin de l'heure, le service s'exécute de nouveau. Ce cycle se poursuit toutes les heures indéfiniment.

Le paramètre RandomizedDelaySec fournit une limite de valeur pour le retard d'une exécution au-delà de sa programmation.

Dans l'exemple, le service est autorisé à s'exécuter une minute plus tard que sa programmation. Ce paramètre est utile pour empêcher un trop grand nombre de tâches qui commencent en même temps selon un programme spécifié, ce qui risquerait autrement de surcharger les ressources.

OnCalendar est un autre paramètre utile pour la programmation des tâches. Supposons que le paramètre soit défini comme suit :

OnCalendar=*:00/10

Le paramètre *:00 indique toutes les heures en haut de l'heure, tandis que le paramètre /10 indique 10 minutes. Par conséquent, le travail est configuré pour s'exécuter toutes les heures, dix minutes après le début de l'heure.

Pour obtenir la liste complète des paramètres de fichier d'unité de temporisateur systemd pour la programmation d'une tâche, voir les pages de manuel systemd.timer(5).

Conseil

Pour un tutoriel sur l'utilisation de systemd dans Oracle Linux, notamment sur la configuration des fichiers d'unité de temporisateur systemd, voir https://docs.oracle.com/en/learn/ol-systemd/.

Utilisation des unités de minuterie pour contrôler le temps d'exécution des unités de service

Explique comment les unités de minuterie remplacent les tâches cron et comment inspecter, activer et surveiller les services déclenchés par une minuterie.

Les unités de minuterie peuvent être configurées pour contrôler l'exécution des unités de service.

Vous pouvez utiliser des unités de temporisateur au lieu de configurer le démon cron pour les événements basés sur le temps. Les unités de minuterie peuvent être plus compliquées à configurer que la création d'une entrée crontab. Cependant, les unités de minuterie sont plus configurables et les services qu'elles contrôlent peuvent être configurés pour une meilleure journalisation et une intégration plus approfondie avec l'architecture systemd.

Les unités de minuterie sont démarrées, activées et arrêtées de la même manière que les unités de service. Par exemple, pour activer et démarrer une unité de minuterie immédiatement, tapez :

sudo systemctl enable --now myscript.timer

Pour lister tous les temporisateurs existants sur le système, pour voir quand ils ont été exécutés pour la dernière fois et quand ils sont configurés pour l'exécution suivante, tapez :

systemctl list-timers

Pour plus d'informations sur les temporisateurs système, consultez les pages de manuel systemd.timer(5) et systemd.time(7).

Configuration d'une unité de minuterie en temps réel

Les temporisateurs en temps réel s'activent pour un événement de calendrier, comme pour les événements d'un crontab. L'option OnCalendar indique quand le temporisateur exécute un service.

  • Si nécessaire, créez un fichier .service qui définit le service à déclencher par l'unité de temporisateur. Dans la procédure suivante, l'exemple de service est /etc/systemd/system/update.service, qui est une unité de service qui exécute un script de mise à jour.

    Pour plus d'informations sur la création d'unités de service, voir Création d'un service systemd basé sur l'utilisateur.

  • Déterminez l'heure et la fréquence d'exécution du service. Dans cette procédure, le temporisateur est configuré pour exécuter le service toutes les 2 heures du lundi au vendredi.

Cette tâche vous montre comment créer un temporisateur système pour déclencher l'exécution d'un service en fonction d'un événement de calendrier. La définition de l'événement de calendrier est similaire aux entrées que vous placez dans une tâche cron.

  1. Créez /etc/systemd/system/update.timer avec le contenu suivant :
    [Unit]
    Description="Run the update.service every two hours from Mon to Fri."
    
    [Timer]
    OnCalendar=Mon..Fri 00/2 
    Unit=update.service
    
    [Install]
    WantedBy=multi-user.target

    OnCalendar peut utiliser un paramètre simple tel que OnCalendar=weekly ou utiliser des définitions plus complexes plus détaillées. Toutefois, le format de définition des paramètres est constant, comme suit :

    DayofWeek Year-Month-Day Hour:Minute:Second

    La définition suivante signifie " les 4 premiers jours de chaque mois à 12h00 du midi, mais seulement si ce jour est soit un lundi soit un mardi " :

    OnCalendar=Mon,Tue *-*-01..04 12:00:00

    Pour d'autres façons de définir OnCalendar et pour plus d'options de temporisateur que vous pouvez configurer dans le fichier de temporisateur système, consultez les pages de manuel systemd.timer(5) et systemd.time(7).

  2. Vérifiez que tous les fichiers associés à cette minuterie sont configurés correctement.
    systemd-analyze verify /etc/systemd/system/update.*

    Toutes les erreurs détectées sont signalées à l'écran.

  3. Démarrez la minuterie.
    sudo systemctl start update.timer

    Cette commande démarre le temporisateur pour la session en cours uniquement.

  4. Assurez-vous que le temporisateur démarre lorsque le système est démarré.
    sudo systemctl enable update.timer

Configuration d'une unité de minuterie monotonique

Les temporisateurs monotones s'activent après un intervalle de temps par rapport à un point de départ variable, tel qu'un événement d'initialisation, ou lorsqu'une unité systemd particulière devient active. Ces unités de minuterie s'arrêtent si l'ordinateur est temporairement suspendu ou arrêté. Les temporisateurs monotones sont configurés à l'aide de l'option OnTypeSec, où Type est le nom de l'événement auquel le temporisateur est lié. Les temporisateurs monotoniques courants comprennent OnBootSec et OnUnitActiveSec.

  • Si nécessaire, créez un fichier .service qui définit le service à déclencher par l'unité de temporisateur. Dans la procédure suivante, l'exemple de service est /etc/systemd/system/update.service, qui est une unité de service qui exécute un script de mise à jour.

    Pour plus d'informations sur la création d'unités de service, voir Création d'un service systemd basé sur l'utilisateur.

  • Déterminez l'heure et la fréquence d'exécution du service. Dans cette procédure, le temporisateur est configuré pour exécuter le service 10 minutes après un démarrage du système, et toutes les 2 heures à compter de la dernière activation du service.

Cette tâche vous montre comment créer un temporisateur système pour déclencher l'exécution d'un service lors d'événements spécifiques, c'est-à-dire lorsque le système démarre ou après 2 heures d'interruption de l'activation du temporisateur.

  1. Créez /etc/systemd/system/update.timer avec le contenu suivant :
    [Unit]
    Description="Run the update.service every two hours from Mon to Fri."
    
    [Timer]
    OnBootSec=10min
    OnUnitActiveSec=2h
    Unit=update.service
    
    [Install]
    WantedBy=multi-user.target

    Pour plus d'options de temporisateur que vous pouvez configurer dans le temporisateur système, consultez les pages de manuel systemd.timer(5) et systemd.time(7).

  2. Vérifiez que tous les fichiers associés à cette minuterie sont configurés correctement.
    systemd-analyze verify /etc/systemd/system/update.*

    Toutes les erreurs détectées sont signalées à l'écran.

  3. Démarrez la minuterie.
    sudo systemctl start update.timer

    Cette commande démarre le temporisateur pour la session en cours uniquement.

  4. Assurez-vous que le temporisateur démarre lorsque le système est démarré.
    sudo systemctl enable update.timer

Exécution d'une unité de minuterie transitoire

Démontre comment lancer des temporisateurs ponctuels avec systemctl run afin que vous puissiez programmer des tâches ad hoc sans créer de fichiers d'unité.

Les temporisateurs transitoires sont des temporisateurs temporaires qui ne sont valides que pour la session en cours.

Ces temporisateurs peuvent être créés pour exécuter un programme ou un script directement sans nécessiter la configuration des unités de service ou de temporisateur dans systemd. Ces unités sont générées à l'aide de la commande systemd-run. Pour plus d'informations, voir la page de manuel systemd-run(1).

Les options de paramètre que vous ajouteriez au fichier unit-file.timer servent également d'arguments lorsque vous utilisez la commande systemd-run pour exécuter une unité de temporisateur transitoire.

Les exemples suivants montrent comment utiliser systemd-run pour activer les temporisateurs transitoires.

  • Exécutez update.service après 2 heures écoulées.

    sudo systemd-run --on-active="2h" --unit update.service
  • Créez ~/tmp/myfile après 1 heure.

    sudo systemd-run --on-active="1h" /bin/touch ~/tmp/myfile
  • Exécutez ~/myscripts/update.sh 5 minutes après le démarrage du gestionnaire de services. Utilisez cette syntaxe pour exécuter un service après le démarrage du gestionnaire de services lors de la connexion de l'utilisateur.

    sudo systemd-run --on-startup="5m" ~/myscripts/update.sh
  • Exécutez myjob.service 10 minutes après le démarrage du système.

    sudo systemd-run --on-boot="10m" --unit myjob.service
  • Exécutez report.service à la fin de la journée.

    sudo systemd-run --on-calendar="17:00:00"