Que vous automatisiez la maintenance de serveurs, planifiiez des pipelines de donnees ou declenchiz des workflows CI/CD, l'expression cron est le langage universel de la planification de taches. Un generateur d'expressions cron vous aide a construire ces modeles visuellement, tandis qu'un analyseur cron traduit les chaines cryptiques en descriptions lisibles. Ce guide couvre tout, de la syntaxe cron a cinq champs aux exemples pratiques en JavaScript, Python, Bash et plateformes cloud.
Essayez notre outil gratuit de generation et d'analyse d'expressions cron.
Qu'est-ce qu'une expression cron ?
Une expression cron est une chaine compacte definissant un calendrier recurrent pour les taches automatisees. Le nom vient du grec chronos (temps) et du daemon Unix cron. Cron est devenu la norme pour la planification de taches sur tous les systemes d'exploitation et plateformes cloud.
Dans le format crontab Unix classique, une expression cron comporte cinq champs : minute heure jour-du-mois mois jour-de-la-semaine. Chaque champ accepte des nombres, des jokers, des plages, des listes et des pas.
Aujourd'hui, les expressions cron sont utilisees dans Kubernetes CronJobs, GitHub Actions, AWS EventBridge et Vercel cron. Comprendre la syntaxe cron est essentiel pour tout developpeur.
Syntaxe des expressions cron
L'expression cron standard utilise cinq champs. Chaque champ represente une unite de temps :
| Champ | Valeurs | Caracteres speciaux | Description |
|---|---|---|---|
| Minute | 0-59 | * , - / | Minute d'execution |
| Heure | 0-23 | * , - / | Heure (format 24h) |
| Jour du mois | 1-31 | * , - / ? L W | Jour du mois |
| Mois | 1-12 | * , - / | Mois de l'annee |
| Jour de la semaine | 0-7 | * , - / ? L # | Jour de la semaine |
Caracteres speciaux : * correspond a toutes les valeurs. La virgule , separe une liste. Le tiret - definit une plage. La barre oblique / definit un pas (ex: */5 = toutes les 5 minutes).
Le format est : * * * * * (minute heure jour mois jour-semaine). Ce modele a cinq champs est le coeur de toute definition de planification cron.
Tableau d'exemples d'expressions cron
Voici les exemples les plus courants d'expressions cron en production :
| Expression cron | Description |
|---|---|
* * * * * | Chaque minute |
*/5 * * * * | Toutes les 5 minutes |
0 * * * * | Chaque heure |
0 0 * * * | Chaque jour a minuit |
0 9 * * 1-5 | Jours ouvrables a 9h |
0 0 1 * * | Premier jour de chaque mois |
Exemples de code pour les taches cron
JavaScript / Node.js Taches cron
Node.js offre plusieurs bibliotheques pour la planification cron, notamment node-cron, cron, croner et Bree :
// ===== node-cron (most popular) =====
// npm install node-cron
const cron = require('node-cron');
// Run every 5 minutes
cron.schedule('*/5 * * * *', () => {
console.log('Running task every 5 minutes');
// Your task logic here
});
// Run weekdays at 9:00 AM
cron.schedule('0 9 * * 1-5', () => {
console.log('Good morning! Running weekday task.');
}, {
timezone: 'America/New_York'
});
// Validate a cron expression
console.log(cron.validate('*/5 * * * *')); // true
console.log(cron.validate('60 * * * *')); // false
// ===== cron npm package =====
// npm install cron
const { CronJob } = require('cron');
const job = new CronJob(
'0 */6 * * *', // every 6 hours
function () {
console.log('Running every 6 hours');
},
null, // onComplete
true, // start immediately
'America/Chicago' // timezone
);
// ===== croner (modern, zero-dependency) =====
// npm install croner
import { Cron } from 'croner';
// Run every minute
const task = new Cron('* * * * *', () => {
console.log('Tick every minute');
});
// Run at specific time, get next run
const next = task.nextRun();
console.log('Next execution:', next);
// Stop the job
task.stop();
// ===== Bree (worker-thread scheduler) =====
// npm install bree
const Bree = require('bree');
const bree = new Bree({
jobs: [
{
name: 'backup',
cron: '0 2 * * *', // daily at 2 AM
path: './jobs/backup.js'
},
{
name: 'cleanup',
cron: '0 0 * * 0', // weekly on Sunday
path: './jobs/cleanup.js'
}
]
});
bree.start();Python Planification cron
Python propose schedule, APScheduler, python-crontab et Celery Beat pour la planification de taches :
# ===== schedule library (human-friendly) =====
# pip install schedule
import schedule
import time
def backup_database():
print("Backing up database...")
def send_report():
print("Sending daily report...")
schedule.every(5).minutes.do(backup_database)
schedule.every().day.at("09:00").do(send_report)
schedule.every().monday.at("08:30").do(send_report)
while True:
schedule.run_pending()
time.sleep(1)
# ===== APScheduler (enterprise-grade) =====
# pip install apscheduler
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
scheduler = BlockingScheduler()
# Using cron expression syntax
@scheduler.scheduled_job(CronTrigger.from_crontab('*/10 * * * *'))
def cleanup_temp_files():
print("Cleaning temp files every 10 minutes")
# Using keyword arguments
@scheduler.scheduled_job('cron', hour=9, minute=0, day_of_week='mon-fri')
def weekday_report():
print("Weekday report at 9:00 AM")
# First Monday of each month at 3 AM
@scheduler.scheduled_job('cron', day='1-7', day_of_week='mon', hour=3)
def monthly_audit():
print("Monthly audit")
scheduler.start()
# ===== python-crontab (manage system crontab) =====
# pip install python-crontab
from crontab import CronTab
cron = CronTab(user='myuser')
# Create a new cron job
job = cron.new(
command='/usr/bin/python3 /opt/app/backup.py >> /var/log/backup.log 2>&1'
)
job.setall('0 2 * * *') # Daily at 2 AM
job.set_comment('Nightly database backup')
job.enable()
# List all cron jobs
for job in cron:
print(f"{job.slices} -> {job.command}")
cron.write() # Save changes
# ===== Celery Beat (distributed scheduling) =====
# pip install celery
# celeryconfig.py
from celery.schedules import crontab
beat_schedule = {
'cleanup-every-hour': {
'task': 'tasks.cleanup',
'schedule': crontab(minute=0, hour='*/1'),
},
'weekly-report': {
'task': 'tasks.send_report',
'schedule': crontab(hour=9, minute=0, day_of_week=1),
},
}Bash / Linux Commandes crontab
Sur Linux/macOS, crontab -e pour editer, crontab -l pour lister les taches :
# ===== Essential crontab commands =====
# Edit your user crontab
crontab -e
# List current cron jobs
crontab -l
# Remove all cron jobs (use with caution!)
crontab -r
# Edit another user's crontab (requires root)
sudo crontab -u www-data -e
# ===== Example crontab file =====
# Set environment variables at the top
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin
MAILTO=admin@example.com
TZ=UTC
# m h dom mon dow command
# Backup database every night at 2 AM
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
# Run cleanup every 15 minutes with flock
*/15 * * * * flock -n /tmp/cleanup.lock /opt/scripts/cleanup.sh
# Send report on weekdays at 9 AM
0 9 * * 1-5 /opt/scripts/daily-report.sh 2>&1 | logger -t daily-report
# Rotate logs on the 1st of each month
0 0 1 * * /usr/sbin/logrotate /etc/logrotate.conf
# Health check every minute (ping monitoring service)
* * * * * curl -fsS --retry 3 https://hc-ping.com/your-uuid > /dev/null
# ===== System crontab (/etc/cron.d/) =====
# /etc/cron.d/myapp (includes username field)
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
# Note: system crontab includes a user field
*/5 * * * * www-data /opt/myapp/cron/process-queue.sh
0 3 * * * root /opt/myapp/cron/maintenance.sh
# ===== Logging best practices =====
# Log with timestamp
0 * * * * /opt/scripts/job.sh 2>&1 | while read line; do \
echo "$(date '+\%Y-\%m-\%d \%H:\%M:\%S') $line"; \
done >> /var/log/myjob.log
# MAILTO for error notifications
MAILTO=ops-team@example.com
# Only errors are emailed (stdout goes to log, stderr to email)
0 */6 * * * /opt/scripts/etl.sh >> /var/log/etl.logCloud & CI/CD Planification cron
Les expressions cron sont utilisees dans GitHub Actions, AWS EventBridge, Kubernetes CronJob et Vercel cron :
# ===== GitHub Actions scheduled workflow =====
# .github/workflows/scheduled.yml
name: Scheduled Tasks
on:
schedule:
# Run every day at 6 AM UTC
- cron: '0 6 * * *'
# Run every Monday at 9 AM UTC
- cron: '0 9 * * 1'
workflow_dispatch: # Allow manual trigger
jobs:
daily-task:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./scripts/daily-task.sh
---
# ===== AWS EventBridge (CloudWatch) cron =====
# Note: AWS cron has 6 fields (includes year)
# Format: minute hour day-of-month month day-of-week year
# Every 5 minutes
aws events put-rule \
--name "every-5-min" \
--schedule-expression "cron(*/5 * * * ? *)"
# Weekdays at 9 AM UTC
aws events put-rule \
--name "weekday-morning" \
--schedule-expression "cron(0 9 ? * MON-FRI *)"
# First day of each quarter
aws events put-rule \
--name "quarterly" \
--schedule-expression "cron(0 0 1 1,4,7,10 ? *)"
---
# ===== Kubernetes CronJob =====
# k8s-cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: database-backup
spec:
schedule: "0 2 * * *" # Daily at 2 AM
timeZone: "America/New_York" # Available since k8s 1.27
concurrencyPolicy: Forbid # Prevent overlapping runs
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 3
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: myapp/backup:latest
command: ["/bin/sh", "-c", "./backup.sh"]
env:
- name: DB_HOST
valueFrom:
secretKeyRef:
name: db-credentials
key: host
restartPolicy: OnFailure
---
# ===== Vercel cron (vercel.json) =====
{
"crons": [
{
"path": "/api/cron/daily-cleanup",
"schedule": "0 0 * * *"
},
{
"path": "/api/cron/hourly-sync",
"schedule": "0 * * * *"
},
{
"path": "/api/cron/weekly-report",
"schedule": "0 9 * * 1"
}
]
}Fonctionnalites cron avancees
De nombreuses implementations etendent la syntaxe avec un champ secondes (6 champs) et un champ annee (7 champs). Quartz, node-cron et Spring Framework supportent ces formats etendus.
Caracteres etendus : L = dernier, W = jour ouvrable le plus proche, # = Nieme occurrence d'un jour de la semaine.
Raccourcis non standard : @reboot, @yearly, @monthly, @weekly, @daily, @hourly sont des alias pratiques.
Debogage et surveillance des taches cron
Problemes de fuseau horaire : definissez toujours TZ=UTC dans votre crontab pour eviter les surprises.
Problemes de PATH : le daemon cron utilise un environnement minimal. Utilisez des chemins absolus.
Sortie non capturee : redirigez toujours stdout et stderr vers un fichier log.
Executions superposees : utilisez flock pour empecher les executions simultanees.
Bonnes pratiques pour les taches cron
Commentaires descriptifs : documentez chaque entree crontab.
Redirection et journalisation : redirigez vers des fichiers log dedies.
Exclusion mutuelle avec flock : empĂȘchez les executions superposees.
Definir SHELL et PATH : declarez explicitement l'environnement.
Chemins absolus : utilisez des chemins absolus partout.
Services de surveillance : utilisez healthchecks.io ou Cronitor.
Conscience des fuseaux horaires : documentez et utilisez UTC.
Questions frequemment posees
Que signifient les cinq champs d'une expression cron ?
Les cinq champs representent : minute (0-59), heure (0-23), jour du mois (1-31), mois (1-12), jour de la semaine (0-7). Chaque champ accepte des valeurs exactes, jokers (*), plages, listes et pas.
Quelle est la difference entre cron et les timers systemd ?
Cron est le planificateur Unix traditionnel. Les timers systemd sont l'alternative moderne sur Linux : ils supportent les evenements, gĂšrent les executions manquees et s'integrent a journalctl. Cron reste le standard dans le cloud.
Comment executer une tache cron toutes les N minutes ?
Utilisez la syntaxe */N dans le champ minute. Exemples : toutes les 5 minutes = "*/5 * * * *", toutes les 15 minutes = "*/15 * * * *". Le pas doit diviser 60 pour des intervalles reguliers.
Guides connexes :
- Exemples d'expressions cron : modeles courants
- Planification cron serverless : GitHub Actions, Vercel & Cloudflare
Maitriser les expressions cron est essentiel pour tout developpeur. Utilisez notre outil gratuit pour generer et analyser des expressions cron.
Generez et analysez des expressions cron avec notre outil gratuit.