Petit rappel : SystemD est le système d'initialisation de bon nombre de distribution linux moderne. Il a été créé comme un remplaçant à SysV Init, mais celui-ci est toujours activement utilisé. Ici je ne rentrerai pas dans le débat SystemD vs SysV vs ???, ce n'est pas le sujet.

Le concept

L'idée avec SystemD c'est de créer un timer qui correspond à la fréquence à laquelle on veut répéter une tâche. Un timer c'est grosso-modo un service SystemD qui va être activé selon une condition temporelle avec une syntaxe toute simple de SystemD. Il va agir comme un métronome qui activera le service à chaque tempo.

Ensuite on va créer un service qui dépend de ce timer. Ce service ne va faire que 2 choses : indiquer une commande à exécuter et indiquer le timer en dépendance. En indiquant cette dépendance, à chaque fois que le timer sera activé, le service sera démarré.

À noter qu'on est pas obligé de créer plusieurs fois le même timer si on a plusieurs tâches qui s'exécute à la même fréquence, on peut dépendre du même timer.

Créer un timer quotidien

Créer un dossier `/etc/systemd/system/timer-daily.target.wants` pour indiquer à SystemD qu'on veut activer le timer quotidien.

On crée ensuite un timer en créant le fichier `/etc/systemd/system/timer-daily.timer` contenant :

[Unit]
Description=Daily Timer

[Timer]
OnCalendar=daily
Persistent=true
Unit=timer-daily.target

[Install]
WantedBy=basic.target

On crée une target pour notre timer en créant un fichier `/etc/systemd/system/timer-daily.target` contenant :

[Unit]
Description=Daily Timer Target
StopWhenUnneeded=yes

On définit notre tâche à répéter

On va ensuite créer un fichier dédier à notre tâche `/etc/systemd/system/ma-tache.service` :

[Unit]
Description=Starts program bar
Wants=timer-daily.timer

[Service]
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
ExecStart=/usr/bin/ma-commande --option1 --option2 # Plus d'un ExecStart peuvent être utilisés si nécessaire

[Install]
WantedBy=timer-daily.target

Attention à bien utiliser le chemin absolu vers notre exécutable !

On active et démarre notre timer et notre service

systemctl enable ma-tache.service 
systemctl start ma-tache.service 

systemctl enable timer-daily.timer 
systemctl start timer-daily.timer

Comme un service classique on peut tracer le démarrage de nos services via les commandes systemctl habituelles.

Et si je veux autre chose qu'une répétition quotidienne ?

Voici un lien vers la documentation ArchLinux Fr : https://wiki.archlinux.fr/Systemd/cron. Cette documentation est très clair et indique comment créer des crons qui se répète à chaque heure, chaque semaine, chaque mois, même un délai complètement arbitraire (je vous vois déjà vouloir un timer qui se répète chaque lundi impair 😉).

Crédit photo : https://pixabay.com/photos/pocket-watch-time-of-sand-time-3156771/