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
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.