TL;DR (Réponses cron rapides)
- Cron expression (Unix) : 
minute hour day-of-month month day-of-week→ 5 champs. - Variantes Quartz/Spring : souvent 6 ou 7 champs (ajout des seconds, parfois year) et le wildcard spécial **
?** pour no specific value dans DOM/DOW. - Kubernetes CronJob : 
spec.scheduleutilise le format cron standard ; les clusters modernes supportentspec.timeZonepour des plannings à l’heure locale. - Bonne pratique : Toujours tester & monitorer tes cron jobs ; journalise les sorties et configure des alertes en cas d’échec.
 
C’est quoi Cron ?
Cron est un planificateur de tâches basé sur le temps dans les systèmes de type Unix. Il exécute des commandes à des intervalles définis via des cron expressions. Chaque ligne dans ton crontab déclare quand et quoi exécuter.
Où tourne cron :
- System crontab : 
/etc/crontab(contient un champ utilisateur) - User crontab : 
crontab -epar utilisateur 
Des chaînes prédéfinies comme
@hourly,@daily,@weekly,@monthly,@rebootsont des raccourcis que tu peux utiliser à la place d’expressions complètes.
Syntaxe des cron expressions (Unix / style POSIX)
Format (5 champs) :
┌───────────── minute (0–59)
│ ┌─────────── hour (0–23)
│ │ ┌───────── day of month (1–31)
│ │ │ ┌─────── month (1–12 or JAN–DEC)
│ │ │ │ ┌───── day of week (0–6 or SUN–SAT; 0 or 7 = Sunday on many systems)
│ │ │ │ │
│ │ │ │ │
* * * * *
Wildcards & opérateurs
*any value,list →1,2,5-range →1-5/step →*/10L,W,#sont des extensions non standard (souvent supportées par Quartz, pas par le cron Unix classique).
Exemples
- Toutes les 15 minutes : 
*/15 * * * * - Tous les jours à 02:00 : 
0 2 * * * - En semaine à 18:30 : 
30 18 * * 1-5 - Premier jour du mois à 07:00 : 
0 7 1 * * 
Astuce portabilité : Évite de dépendre de modificateurs non standard sauf si ton scheduler les documente. Le cron Unix classique n’accepte pas
?,L,Wou#.
Quartz Cron / Spring Cron vs Unix Cron (les différences à connaître)
De nombreux planificateurs applicatifs (p. ex. Quartz, Spring) adoptent une syntaxe étendue :
- Champs : 
seconds minutes hours day-of-month month day-of-week [year]→ 6 ou 7 champs - Spécial 
?: utilisé dans day-of-month ou day-of-week pour signifier no specific value - Des modificateurs étendus comme 
L(last),W(weekday),#(nth weekday) sont souvent supportés. 
Mapping rapide
- Unix : 
0 2 * * *→ tous les jours à 02:00 - Quartz/Spring (avec seconds) : 
0 0 2 * * ?→ tous les jours à 02:00 (aucun DOW spécifique) 
Pièges fréquents
- Coller une expression à 5 champs d’Unix dans Spring/Quartz ne marchera pas. Ajoute seconds (et parfois year) ou utilise un helper pour convertir.
 ?est invalide en Unix cron mais requis dans certains scénarios Quartz.
Kubernetes CronJobs (k8s)
- Définis les plannings via 
spec.schedule(format cron standard). - Les versions récentes de Kubernetes supportent 
spec.timeZone, ce qui permet d’épingler un fuseau horaire IANA (par ex."Europe/Zurich"). Sans cela, les plannings sont évalués selon l’heure locale du controller (souvent UTC). 
Exemple
apiVersion: batch/v1
kind: CronJob
metadata:
  name: db-backup
spec:
  schedule: '0 2 * * *' # 02:00 tous les jours
  timeZone: 'Europe/Zurich' # garantit un planning à l’heure locale (supporté sur les clusters modernes)
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: backup
              image: alpine:3.20
              command: [ 'sh', '-lc', 'pg_dump $DB_URL > /backups/$(date +%F).sql' ]
Générateur / Décodeur de cron expressions (inline)
Utilise la référence rapide ci-dessous pour composer ou décoder des plannings. Copie/colle dans ton crontab ou dans un CronJob k8s.
Modèles rapides
| Langage naturel | Unix cron | Quartz/Spring | 
|---|---|---|
| Chaque minute | * * * * * | 0 * * * * ? | 
| Toutes les 5 minutes | */5 * * * * | 0 */5 * * * ? | 
| Toutes les heures à :30 | 30 * * * * | 0 30 * * * ? | 
| Tous les jours 02:00 | 0 2 * * * | 0 0 2 * * ? | 
| Semaine (lun–ven) 18:30 | 30 18 * * 1-5 | 0 30 18 ? * MON-FRI | 
| 1er du mois 07:00 | 0 7 1 * * | 0 0 7 1 * ? | 
| Dimanches 00:00 | 0 0 * * 0 | 0 0 0 ? * SUN | 
| Dernier jour du mois 23:00 | (non standard en Unix) | 0 0 23 L * ? | 
Aide au décodage
- Tout 
*/N→ exécute toutes les N unités de ce champ. - DOM et DOW tous deux définis → le comportement varie selon l’implémentation ; reste sur un seul (ou utilise 
?avec Quartz). 
Bases de crontab
- Éditer : 
crontab -e - Lister : 
crontab -l - Environnement : définis 
PATH,SHELL,MAILTOet tes variables explicitement—cron tourne avec un environnement minimal. - Sortie : capture avec 
>> /var/log/myjob.log 2>&1ou compte sur le mail système. 
Checklist de debug cron
- La commande est-elle exécutable en tant que même utilisateur ?
 - Les chemins absolus sont-ils utilisés pour les binaires et les fichiers ?
 - L’environnement (PATH, LANG, TZ) est-il défini ?
 - L’expression est-elle valide pour la saveur de ton scheduler ?
 - Les échecs sont-ils monitorés/alertés ?
 
Monitoring & fiabilité
- Redirige les sorties vers des logs et alerte si les codes de retour ≠ 0.
 - Pense à des moniteurs dédiés (health pings, heartbeats) qui alertent quand des exécutions manquent.
 - Dans Kubernetes, surveille les statuts des Job, règle backoffLimit et conserve un peu d’historique.
 
Cron FAQs
Unix cron utilise 5 champs et ne prend pas en charge ?, L, W ou #. Quartz/Spring utilisent 6–7 champs (ajout des seconds/year) et autorisent ? ainsi que des modificateurs de date.
Préfixe avec le champ seconds (souvent 0) et utilise ? dans DOM ou DOW si l’autre est spécifié. Exemple : Unix 0 2 * * * → Spring 0 0 2 * * ?.
Par défaut, les plannings sont évalués selon l’heure locale du controller (souvent UTC). Les clusters modernes prennent en charge spec.timeZone pour forcer un fuseau horaire IANA comme "Europe/Zurich".
Le cron classique ne gère pas les intervalles sous la minute. Utilise des systemd timers, une boucle avec sleep, des planificateurs applicatifs ou Quartz (avec le champ seconds).
Cron tourne avec un environnement minimal et potentiellement un utilisateur différent. Mets des chemins absolus et PATH ; teste avec le même utilisateur ; journalise explicitement les erreurs.
Pas directement avec le cron classique. Utilise deux entrées (décalées de 30 minutes) ou un wrapper avec un planificateur plus malin.
Utilise un mécanisme non concurrent dans le code du job (locks) ou configure concurrencyPolicy: Forbid dans le spec du CronJob.
Cela veut dire « aucune valeur spécifique » et n’est valide que dans les champs day-of-month ou day-of-week, typiquement quand l’autre est spécifié.
En général oui, mais les chaînes prédéfinies peuvent varier selon les implémentations ; préfère la forme explicite à 5 champs pour la portabilité.
Cron Checklist
- Identifie la saveur de scheduler (Unix, systemd timer, Quartz/Spring, k8s).
 - Normalise les expressions à cette saveur (5 vs 6/7 champs, symboles spéciaux).
 - Épingle le fuseau horaire et clarifie le comportement DST.
 - Ajoute du monitoring (heartbeat + alertes d’échec).
 - Documente la responsabilité, les runbooks et les chemins d’escalade.