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/