Créer un cron quotidien avec SystemD

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/