Convertisseur d'Expression Cron en Timer systemd

Outil gratuit pour convertir une expression cron (minute heure jour mois jour de la semaine) en syntaxe OnCalendar= des timers systemd. Avertit de la sémantique OU jour-du-mois/jour-de-la-semaine, utile pour migrer des tâches cron vers des environnements Docker/Kubernetes.

Correspondance entre champs cron et composants systemd

Les 5 champs d'une expression cron correspondent à la syntaxe OnCalendar= de systemd de la manière suivante.

Position Champ cron Équivalent systemd
1 Minute Minute de la partie horaire (MM dans HH:MM:SS)
2 Heure Heure de la partie horaire (HH dans HH:MM:SS)
3 Jour du mois Jour de la partie date (jour dans année-mois-jour)
4 Mois Mois de la partie date (mois dans année-mois-jour)
5 Jour de la semaine Préfixe du jour de la semaine (ex. Mon, Mon..Fri)

Comme cron n'a pas de champ des secondes, la composante des secondes de systemd est toujours "00". Lorsque le jour du mois et le mois ne sont pas restreints (*), la partie année-mois-jour de systemd peut être entièrement omise.

Numéro de jour cron et abréviation de jour systemd

Cron représente les jours de la semaine par des chiffres de 0 à 7, tandis que systemd utilise des abréviations anglaises.

Numéro de jour cron Abréviation systemd
0 (7) Sun
1 Mon
2 Tue
3 Wed
4 Thu
5 Fri
6 Sat

Exemples de conversion courants

Expression cron OnCalendar= Signification
* * * * * OnCalendar=*-*-* *:*:00 S'exécute chaque minute (équivalent à "* * * * *" en cron).
*/15 * * * * OnCalendar=*:00/15:00 S'exécute toutes les 15 minutes.
0 9 * * 1-5 OnCalendar=Mon..Fri 09:00:00 S'exécute à 9h du lundi au vendredi.
0 0 1 * * OnCalendar=*-*-01 00:00:00 S'exécute à minuit le 1er de chaque mois.
0 0 1 1 * OnCalendar=*-01-01 00:00:00 S'exécute à minuit le 1er janvier de chaque année.
0 0 1 * 1 OnCalendar=Mon *-*-01 00:00:00 Exemple avec jour du mois (le 1er) et jour de la semaine (lundi) spécifiés en même temps. En cron, c'est une condition OU (s'exécute si l'un des deux correspond), mais en systemd cela devient une condition ET (ne s'exécute que si les deux correspondent), donc le résultat converti s'exécute moins souvent que l'expression cron d'origine.

Une expression cron qui restreint à la fois le jour du mois et le jour de la semaine (aucun des deux n'étant "*") ne peut pas être convertie avec précision vers la syntaxe OnCalendar de systemd, car cron utilise une sémantique OU dans ce cas, alors que systemd utilise toujours une sémantique ET. Envisagez de diviser ces cas en deux timers systemd distincts.

Astuces

  • Si vous restreignez à la fois le jour du mois et le jour de la semaine à autre chose que "*", la condition OU de cron ne peut pas être représentée avec précision par la condition ET de systemd. Vérifiez l'avertissement dans le résultat et envisagez de diviser en deux timers si nécessaire.
  • Certaines images de base de conteneurs minimales (par exemple les images Docker basées sur Alpine) n'embarquent aucun démon cron, ce qui fait des timers systemd un remplacement pratique lors de la migration de tâches planifiées.
  • Vous pouvez valider la ligne OnCalendar générée avec la commande "systemd-analyze calendar", qui affiche également les prochaines heures d'exécution planifiées.
  • Contrairement à une simple ligne de crontab, un timer systemd est composé de deux fichiers : une unité .timer (le planning) et une unité .service (la tâche réellement exécutée).
  • Pour les plannings simples qui ne combinent pas jour du mois et jour de la semaine (horaire, quotidien, hebdomadaire, etc.), cette conversion est toujours exacte.

Questions fréquentes

OnCalendar= prend la forme "jour_semaine année-mois-jour heure:minute:seconde" (les parties jour de la semaine et date sont facultatives). "*" signifie "toute valeur", ".." indique une plage, "/" un intervalle, et "," énumère plusieurs valeurs. Par exemple, "Mon..Fri 09:00:00" signifie exactement 9h en semaine.

Les timers systemd offrent des fonctionnalités que cron seul n'a pas : journaux d'exécution centralisés via journalctl, attente du démarrage des services dépendants, et nouvelles tentatives automatiques configurables en cas d'échec. Par ailleurs, les images de base des conteneurs se passent de plus en plus du démon cron pour rester légères, faisant des timers le remplacement naturel sur les hôtes basés sur systemd.

Selon la sémantique de Vixie cron, lorsque le jour du mois et le jour de la semaine sont tous deux restreints (aucun n'est "*"), la tâche s'exécute si l'un des deux correspond — une condition OU. La syntaxe OnCalendar de systemd traite cependant toujours les parties jour de la semaine et date comme une condition ET (les deux doivent correspondre). Cet outil détecte ce cas et affiche un avertissement indiquant que le résultat converti peut s'exécuter moins souvent que l'expression cron d'origine.

Pour les plannings simples qui ne combinent pas jour du mois et jour de la semaine, la conversion est exacte. Mais si l'avertissement de sémantique OU apparaît, la fréquence réelle peut différer de celle prévue ; nous recommandons donc de vérifier les prochaines heures d'exécution avec "systemd-analyze calendar" avant un déploiement en production.

Une expression cron standard à 5 champs n'a pas de champ des secondes, donc la composante des secondes de la ligne OnCalendar générée est toujours "00". La syntaxe OnCalendar de systemd elle-même prend en charge la spécification des secondes, mais cet outil ne l'utilise pas lors de la conversion depuis cron.
ツールくん

Anecdote — De cron aux timers systemd

systemd est apparu vers 2010 comme système d'initialisation chargé de gérer le démarrage de Linux, et est depuis devenu la norme dans la plupart des distributions. Sa fonctionnalité de timers offre une exécution périodique similaire à cron, mais y ajoute des capacités que cron n'a jamais eues : résolution des dépendances, journalisation centralisée des exécutions via journalctl, et comportement de nouvelle tentative configurable en cas d'échec.

Parallèlement, des environnements de conteneurs comme Docker et Kubernetes proposent de plus en plus d'images de base dépourvues de tout démon cron, afin de garder une taille d'image réduite. Lorsqu'une tâche périodique doit s'exécuter dans de tels environnements, les options pratiques consistent soit à s'appuyer sur un mécanisme au niveau de l'orchestrateur, comme un CronJob Kubernetes, soit à le confier aux timers systemd si l'hôte lui-même exécute systemd.

La syntaxe OnCalendar= est plus expressive que les 5 champs de cron, prenant en charge une précision au niveau de l'année et de la seconde, mais c'est justement à cause de cette expressivité accrue que certaines expressions cron (celles qui restreignent à la fois jour du mois et jour de la semaine sous forme de condition OU) changent de signification lors d'une conversion naïve. Cet outil affiche cet avertissement de manière explicite afin que les migrations ne trébuchent pas sur un piège facile à manquer.