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.
Réécrire une expression cron en minuterie systemd
Porter une planification de `cron` vers une minuterie `systemd` revient à traduire les cinq champs — minute, heure, jour du mois, mois et jour de la semaine — dans la syntaxe `OnCalendar=`. Saisissez une expression cron et cet outil produit le `OnCalendar=` correspondant, assorti d'avertissements sur tout ce qui mérite attention.
**Le point capital de cette traduction tient au comportement du jour du mois et du jour de la semaine lorsque les deux sont donnés.** Cron les lit comme un **ou** : `0 0 1 * 1` signifie « le premier du mois **ou** chaque lundi » et peut se déclencher quelque cinq fois par mois. **L'`OnCalendar=` de systemd, en revanche, traite la même indication comme un et.** Elle en vient à signifier « le premier **et** un lundi », et se déclenche une ou deux fois l'an. **Une traduction mécanique change donc la fréquence d'exécution, et elle le fait en silence.** Cet outil repère cette combinaison et vous en avertit.
Comment convertir
- Saisissez l'expression cron Écrivez les cinq champs — minute, heure, jour du mois, mois, jour de la semaine — séparés par des espaces.
- Parcourez l'OnCalendar= produit La syntaxe systemd correspondante vous est livrée.
- Lisez les avertissements **Là où jour du mois et jour de la semaine sont tous deux donnés, le changement de sens vous est signalé.**
- Recopiez-le dans une unité de minuterie Collez-le dans la section `[Timer]` d'un fichier `.timer`.
Astuces pour en tirer le meilleur parti
- 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.
Dans quels cas s'en servir
Pour passer à un environnement de conteneurs
**Les conteneurs n'embarquent souvent aucun démon cron : les planifications doivent donc migrer vers des minuteries systemd ou un autre dispositif.**
Pour vouloir une trace de ce qui a tourné
Une minuterie systemd laisse sa trace dans journald, que l'on peut suivre ensuite.
Pour vouloir des dépendances entre tâches
**Ne tourner qu'après le démarrage d'une autre unité est chose que cron ne sait exprimer.**
Pour faire l'inventaire des planifications existantes
Convertir d'un coup un jeu d'expressions cron vous donne l'occasion de vérifier que les intervalles sont ceux voulus.
Vocabulaire des planificateurs
- Expression cron
- La syntaxe exprimant une heure par cinq champs : minute, heure, jour du mois, mois et jour de la semaine. **Jour du mois et jour de la semaine se lisent comme un ou.**
- OnCalendar=
- La clé indiquant l'heure dans une minuterie systemd. **Jour du mois et jour de la semaine s'y lisent comme un et.**
- Unité de minuterie
- Un fichier portant l'extension `.timer`, qui démarre le `.service` de même nom.
- Persistent=
- **Le réglage qui fait rattraper une minuterie au démarrage si le système était éteint à l'heure prévue.** Il agit à la manière d'`anacron` pour cron.
- AccuracySec=
- La tolérance sur l'heure de déclenchement. Une minute de latitude s'applique par défaut : indiquez-la là où l'heure doit être exacte.
- Journald
- La collecte des journaux de systemd. La sortie d'une tâche lancée par une minuterie y est également conservée.
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.