Crontab Guru

Incolla un’espressione cron e ottieni una spiegazione campo per campo, in inglese semplice, di cosa fa. Nessun bisogno di ricordare l’ordine dei campi o di consultare gli intervalli: il guru esamina ciascuno dei cinque campi (minuto, ora, giorno del mese, mese e giorno della settimana) e legge l’espressione da sinistra a destra. Utile per controllare una riga di crontab prima di implementarla o per spiegare una riga ereditata.

Come usare il guru

  1. 1

    Incolla l'espressione

    Copia qualsiasi espressione cron standard a 5 campi (per esempio `0 9 * * 1-5`) nel campo di input.

  2. 2

    Chiedi la spiegazione

    Clicca su Explain Cron e lo strumento restituisce una descrizione riga per riga di ogni campo: minuto, ora, giorno del mese, mese e giorno della settimana.

  3. 3

    Leggi la descrizione

    La spiegazione viene generata in inglese, per esempio "Minute: every 5 minutes" oppure "Hour: from 9 through 17."

  4. 4

    Controlla prima di implementare

    Usa la spiegazione per confermare che la pianificazione faccia ciò che vuoi prima di metterla nel tuo crontab, nella configurazione CI o in un manifest Kubernetes.

Scheda di riferimento dei campi

 ┌───────────── minuto (0-59)
 │ ┌─────────── ora (0-23)
 │ │ ┌───────── giorno del mese (1-31)
 │ │ │ ┌─────── mese (1-12 o GEN-DIC)
 │ │ │ │ ┌───── giorno della settimana (0-6 o DOM-SAB; Dom = 0 o 7)
 │ │ │ │ │
 * * * * *

Operatori nelle espressioni cron

Operatore Significato Esempio
* Ogni valore * * * * *
, Elenco di valori 0,15,30,45
- Intervallo 9-17
/ Passo (inizio/passo) */5, 0-30/5
L Ultimo (giorno del mese o ultimo giorno feriale, Quartz) L, 5L
W Giorno feriale più vicino 15W (Quartz)
# N-esimo giorno feriale del mese 1#3 (Quartz)
? Nessun valore specifico Solo Quartz

L’ordine di lettura è importante

0 */2 * * 1-5 si legge da sinistra a destra come: minuto 0, ogni 2 ore, qualsiasi giorno del mese, qualsiasi mese, da lunedì a venerdì. Per abitudine, a volte si leggono i campi da destra a sinistra e ci si confonde; inizia sempre dal minuto.

La trappola dei “ogni X minuti”

*/10 * * * * si attiva ai minuti 0, 10, 20, 30, 40, 50, non “ogni 10 minuti da quando è stato creato il lavoro.” I passi cron misurano sempre dall’inizio dell’intervallo del campo. Se distribuisci un lavoro alle 12:03, la prima esecuzione è alle 12:10, non alle 12:13.

Per i lavori che hanno davvero bisogno di “N minuti dopo l’ultima esecuzione,” usa un pianificatore con un timer persistente (timer systemd con OnUnitActiveSec, o pianificazione a livello di applicazione con un timestamp dell’ultima esecuzione memorizzato).

Insidie di cron che conviene conoscere

  • Giorno del mese + giorno della settimana entrambi impostati: la maggior parte delle implementazioni cron lo tratta come comportamento OR, probabilmente non quello che vuoi.
  • Passo di 0: */0 non è valido.
  • Intervallo che si avvolge: 22-2 per le ore non funziona nel cron classico; usa 22-23,0-2.
  • 30 febbraio: un programma come 0 0 30 2 * non si attiva mai.
  • Ambiguità DST: i lavori pianificati tra le 2 e le 3 di notte possono attivarsi due volte o zero volte nei giorni di cambio ora.

Cron vs pianificatori moderni

Unix cron è ancora ovunque, ma per qualsiasi cosa critica probabilmente vorrai:

  • timer systemd: catturare esecuzioni mancate, supportare offset casuali, leggere dai file di unità.
  • Kubernetes CronJob: dichiarativo, retry, consapevole del fuso orario in 1.25+.
  • Airflow / Prefect / Dagster: per lavori con dipendenze, retry, backfill e osservabilità.
  • Pianificazione di GitHub Actions: cron a 5 campi, solo UTC, intervallo minimo di 5 minuti, consegna best-effort.

Il cron in sé è un ottimo formato, ma un cattivo pianificatore per lavori che non devono essere persi.

Domande frequenti

Perché il giorno della settimana 0 è domenica nel cron standard (e 7 è anche domenica, supportando entrambe le convenzioni). Lunedì è 1. Quartz numera i giorni della settimana da 1 a 7 con domenica = 1, il che confonde spesso chi passa da un’implementazione all’altra.

Il cron Unix classico funziona nel fuso orario locale del server, qualunque cosa dica /etc/timezone. Kubernetes CronJob, GitHub Actions e la maggior parte dei pianificatori cloud funzionano in UTC per impostazione predefinita. Conferma sempre e, quando possibile, usa UTC per evitare sorprese legate all’ora legale.

Il cron classico non può esprimerlo direttamente. Soluzione alternativa: esegui ogni lunedì e controlla la data dentro lo script: [ $(date +%d) -le 7 ] && ./job.sh. Quartz lo supporta nativamente con 1#1.

No. Ogni pianificazione ha bisogno della propria riga. Ma puoi combinare più pianificazioni in una riga con elenchi: 0 9,17 * * * si attiva alle 9 e alle 17. Per pianificazioni che non possono essere espresse in una singola riga, aggiungi più righe che puntano allo stesso comando.

Strumenti correlati