Calcolare le prossime esecuzioni di un'espressione cron

analizza e mostra le prossime date di esecuzione della configurazione cron

Cos'è un'espressione cron?

Un'espressione cron è una stringa breve che descrive una ricorrenza nel tempo. Il formato ereditato da Unix sta in cinque campi separati da spazi: minuto, ora, giorno del mese, mese e giorno della settimana. Questa sintassi è nata con il demone cron di Brian Kernighan negli anni '70, poi generalizzata dal Vixie cron (1987) ripreso da tutte le distribuzioni Linux e macOS moderne. Oggi, la stessa sintassi si ritrova nella maggior parte degli scheduler cloud (AWS EventBridge, GCP Cloud Scheduler, Azure Logic Apps) e CI/CD (GitHub Actions, GitLab CI, Jenkins).

┌──── minute (0-59)
│ ┌── heure (0-23)
│ │ ┌── jour du mois (1-31)
│ │ │ ┌── mois (1-12 ou JAN-DEC)
│ │ │ │ ┌── jour de la semaine (0-7 ou SUN-SAT, 0 et 7 = dimanche)
│ │ │ │ │
* * * * *

Un'espressione cron ben formata definisce quindi un cron schedule preciso: ogni campo può essere un valore fisso, un intervallo, una lista, un passo o un asterisco che fa match con tutto. La compattezza della crontab expression è la sua forza, ma è anche ciò che rende un cron decoder indispensabile per validare visivamente l'intenzione. È tutto l'oggetto di questo cron converter: produrre una spiegazione cron leggibile, più la lista delle prossime esecuzioni.

Anatomia di un'espressione cron

I cinque campi condividono una grammatica comune. Ecco i limiti accettati da ogni colonna di un' espressione crontab standard:

  • Minuto: 0-59.
  • Ora: 0-23, formato 24h.
  • Giorno del mese: 1-31.
  • Mese: 1-12 o le abbreviazioni testuali JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC.
  • Giorno della settimana: 0-7 dove 0 e 7 rappresentano entrambi domenica, o le abbreviazioni SUN, MON, TUE, WED, THU, FRI, SAT.

Caratteri speciali condivisi dai cinque campi:

  • *: any value, fa match con tutti i valori autorizzati del campo.
  • ,: lista discreta, per esempio 1,15,30 nel campo minuto.
  • -: intervallo inclusivo, per esempio 9-17 per le ore d'ufficio.
  • /: passo (step), per esempio */15 = ogni 15 unità, o 0-30/5 = ogni 5 minuti tra 0 e 30.

Estensioni Quartz (Java, AWS EventBridge, Spring): la grammatica sale a 6 o 7 campi con una colonna secondi in testa (0-59) e talvolta una colonna anno in coda (1970-2099). Quartz introduce anche ? (no specific value, per disaccoppiare giorno-del-mese e giorno-della-settimana), L (last: ultimo giorno del mese, o ultimo venerdì con 5L), W (giorno feriale più vicino) e # (N-esimo giorno della settimana del mese, per esempio 2#3 per il 3° lunedì). Un'espressione Quartz non è generalmente compatibile con una crontab UNIX, e viceversa: è la principale fonte di errore quando si copia una cron expression da una piattaforma all'altra.

# UNIX / Vixie cron (5 champs)
0 9 * * 1-5

# Quartz (6 champs avec secondes)
0 0 9 ? * MON-FRI

# Quartz (7 champs avec année)
0 0 9 ? * MON-FRI 2026

Perché decodificare un'espressione cron?

Leggere 0 0 * * * è rapido. Leggere */7 2-5 1,15 * 1-5 lo è nettamente meno. Quando un'espressione esce dal banale, il rischio di errore di interpretazione sale e la cron decode diventa una tappa di review a parte.

  • Debug produzione: capire perché un'attività si è attivata alle 03:17 e non alle 03:00, o identificare una sovrapposizione tra due job.
  • Code review: validare che uno scheduler proposto in pull request faccia ciò che l'autore pretende, senza dover memorizzare la semantica di ogni simbolo.
  • Audit di scheduler: passare in rassegna i cron job Linux in /etc/crontab e /etc/cron.d/, i trigger Jenkins, gli spec.schedule di Kubernetes CronJob, le regole AWS EventBridge e i job GCP Cloud Scheduler.
  • Migrazione legacy: riprendere una /etc/crontab storica senza documentazione e ricostruire la mappatura delle attività prima di un cambio di infrastruttura.
  • Onboarding: permettere a un nuovo sviluppatore di rileggere una crontab senza dover imparare tutti i caratteri speciali da un giorno all'altro.

Come usare il cron decoder

La procedura per decodificare un'espressione crontab con lo strumento:

  1. Incollate la vostra cron expression nel campo di input (5 campi separati da spazi).
  2. Indicate il numero di prossime esecuzioni da calcolare.
  3. Cliccate su convert per lanciare la cron decode: lo strumento restituisce una frase umana che spiega l'attivazione, più la lista datata delle prossime esecuzioni.
  4. Verificate visivamente che le date corrispondano alla vostra intenzione (ora, giorno, frequenza).
  5. Copiate l'output tramite il pulsante di copia per incollarlo in un ticket, una PR o una documentazione tecnica.

Lo strumento non si limita a un parsing sintattico: fornisce una spiegazione cron in linguaggio naturale, il che ne fa al tempo stesso un cron decoder e un validatore di pianificazione.

Esempi classici di cron expression

I pattern qui sotto coprono l'essenziale dei cron schedule incontrati in produzione. Sono tutti validi su Linux crontab, Kubernetes CronJob, GitHub Actions e la maggior parte degli scheduler applicativi.

Espressione Lettura umana
* * * * * Ogni minuto
0 * * * * Ogni ora in punto
0 0 * * * Tutti i giorni a mezzanotte
0 0 * * 0 Tutte le domeniche a mezzanotte
*/15 * * * * Ogni 15 minuti
0 9 * * 1-5 9:00 dal lunedì al venerdì
0 0 1 * * Il 1° di ogni mese a mezzanotte
0 0,12 * * * A mezzanotte e mezzogiorno tutti i giorni
*/5 9-17 * * 1-5 Ogni 5 minuti in orario d'ufficio
30 2 1,15 * * Il 1° e il 15 del mese alle 2:30

Per eseguire un'attività cron su un server Linux, si modifica la crontab utente dalla shell:

# éditer la crontab de l'utilisateur courant
$ crontab -e

# lister les tâches existantes
$ crontab -l

# exemple de ligne ajoutée : sauvegarde quotidienne à 3h
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Esempio di output del cron converter per */5 * * * *:

2026-05-05 00:00:00
2026-05-05 00:05:00
2026-05-05 00:10:00
2026-05-05 00:15:00
2026-05-05 00:20:00
...

Domande frequenti sul cron decoder

Qual è la differenza tra cron UNIX e Quartz?

UNIX/Vixie cron usa 5 campi (minuto a giorno-della-settimana), senza precisione al secondo, e non ha nozione nativa di «ultimo giorno del mese». Quartz (Java, Spring, AWS EventBridge) aggiunge una colonna secondi in testa, talvolta una colonna anno in coda, e più simboli (?, L, W, #) assenti dalla crontab Linux. Un' espressione cron Quartz a 6 campi non è quindi direttamente portabile verso /etc/crontab, e viceversa. Il nostro cron decoder mira al formato a 5 campi, che copre la maggior parte degli scheduler.

Come eseguire un'attività cron ogni 5 minuti?

Con il passo / sul campo minuto:

*/5 * * * * /usr/local/bin/check-health.sh

Questa crontab expression attiva lo script ai minuti 0, 5, 10, 15... di ogni ora, tutti i giorni. Per limitare alle ore d'ufficio dal lunedì al venerdì, aggiungete i vincoli sui campi ora e giorno-della-settimana: */5 9-17 * * 1-5.

Cosa significa l'asterisco (*) in un'espressione cron?

L'asterisco significa any value: fa match con tutti i valori autorizzati del campo. In 0 0 * * *, i tre asterischi significano «qualsiasi giorno del mese, qualsiasi mese, qualsiasi giorno della settimana». Combinato ai primi due campi fissati a 0, si ottiene «tutti i giorni a mezzanotte». L'asterisco può anche combinarsi con un passo: */15 in minuto = ogni 15 minuti.

Crontab ha un fuso orario?

Per default, il fuso del server. Su una crontab Linux, è la TZ di sistema (spesso UTC sui VPS e sui container). GitHub Actions forza UTC. Kubernetes CronJob usa il fuso del controller, configurabile tramite spec.timeZone dalla 1.27. AWS EventBridge valuta le espressioni in UTC. Gli scheduler applicativi (Symfony Scheduler, Quartz, Airflow) permettono spesso di fissare un fuso dedicato per ogni attività. In caso di dubbio, verificate date sul server target e confrontate con l'output del cron converter.

Cron job vs comando at: quale scegliere?

cron serve a eseguire un'attività ricorrente secondo una pianificazione. at serve a eseguire un comando una sola volta a un istante dato. Per un backup giornaliero, una rotazione di log o una chiamata API regolare, usate cron. Per differire un'operazione unica («rilancia questo deploy alle 22 stasera»), usate at:

$ echo "/usr/local/bin/deploy.sh" | at 22:00
Come testare un'espressione cron senza attivarla?

È precisamente il ruolo di questo cron converter: calcola le N prossime esecuzioni a partire dall'istante corrente, senza avviare alcun job. Vedete immediatamente se la vostra crontab expression scatti alle 03:00 come previsto o alle 03:17 per sbaglio. Per andare oltre prima di installare l'attività, potete anche testare lo script da solo (bash -x script.sh) e verificare la sintassi di un file crontab con crontab -T file sulle distribuzioni che lo supportano.

Cosa succede se giorno-del-mese e giorno-della-settimana sono entrambi fissati?

Su Vixie cron (Linux), la regola è un OR logico: il job scatta se uno o l'altro dei due campi fa match. È contro-intuitivo e fonte di bug. Quartz usa un AND, da cui l'introduzione del simbolo ? per segnalare esplicitamente «nessun vincolo». In generale, fissate solo uno dei due campi.

Esempio di richiesta

curl -X POST https://cdrn.fr/api/v1/tools/cron-converter/execute \
  -H "Content-Type: application/json" \
  -d '{"cron":"...","number_next_date":1}'

Schema di input

Campo Tipo Richiesto Predefinito
cron string
number_next_date integer

Endpoint

  • GET https://cdrn.fr/api/v1/tools - elenca tutti gli strumenti disponibili
  • GET https://cdrn.fr/api/v1/tools/cron-converter - recupera lo schema di questo strumento
  • POST https://cdrn.fr/api/v1/tools/cron-converter/execute - esegue questo strumento con un payload JSON