Des tâches cron aux
timers systemd

Comme une large majorité des utilisauters de systèmes Linux, j’ai longtemps utilisé les tâches cron qui permettent de lancer des commandes ou applications à des intervales réguliers.

La tâche devant être réalisée devait être rentrée dans un fichier, accessible depuis crontab -e:

# m h dom mon dow command
* * * * * /path/to/script.sh  # each minutes
@reboot   /path/to/script.sh  # on startup

Les désavantages de ce système sont multiples. La plus petite unité de temps est la minute ; il n’est pas possible de simplement activer, désactiver, arrêter ou lancer l’une de ces commandes. Enfin, il est très difficile de voir ou de simuler ce qui se passe réellement.

De nos jours, la plupart des distributions Linux embarquent systemd, qui permet simplement de réaliser ce type d’opérations.

Création d’un service

Avec systemd, tout est affaire de services. Voici comment en créer un simplement :

# /etc/systemd/system/myservice.service

[Service]
Type=oneshot
ExecStart=path/to/script.sh
# WorkingDirectory=/home/user/path/
# User=user

Cela indique que le script doit être lancé une fois, et où il est situé. Il est également possible d’indiquer le répertoire de lancement, l’utilisateur qui le lance, des dépendances à d’autres services…

Vous pouvez vérifier que tout fonctionnement correctement avec systemctl start myservice.

Création d’un timer

Le timer va avoir le même nom que notre service, mais avec l’extension .timer :

# /etc/systemd/system/myservice.timer

[Timer]
OnCalendar=*:*:0/10
[Install]
WantedBy=timers.target

La ligne OnCalendar permet de spécifier la fréquence, ou la date d’activation. Le plus souvent, j’utilise une commende de type *-*-* *:*:* qui permet d’indiquer les jours et les heures d’activation. Dans l’exemple ci-dessus, le script est lancé toutes les dix semaines.

Afin de prendre en compte ces changements, on doit lancer cette commande pour actualiser le cache :

systemctl daemon-reload

Enfin, on lance le timer au démarrage :

systemctl enable --now myservice.timer