Generatore di espressioni Cron
Costruisci e comprendi le pianificazioni di job cron in modo visivo.
Preimpostazioni rapide
Prossime 5 esecuzioni
Riferimento di sintassi cron
* · qualsiasi valore
*/5 · ogni 5 unità
1,15 · ai valori 1 e 15
1-5 · intervallo da 1 a 5
Campi: minuto (0-59), ora (0-23), giorno del mese (1-31), mese (1-12), giorno della settimana (0-6, 0=domenica)
Una breve storia dell'espressione cron
L'espressione cron a cinque campi risale a maggio 1975, quando una versione iniziale fu rilasciata dagli AT&T Bell Laboratories come parte di Research Unix Versione 7. Il nome accenna a Chronos, la personificazione greca del tempo. Il formato era semplice: cinque campi separati da spazi (minuto, ora, giorno-del-mese, mese, giorno-della-settimana) su una riga in /usr/lib/crontab. La riscrittura Vixie cron di Paul Vixie nel 1987 è diventata l'implementazione moderna di fatto; ogni grande distribuzione Linux include un cron derivato da Vixie, e Vixie ha aggiunto il crontab per utente, il supporto per le variabili d'ambiente (MAILTO=, CRON_TZ=) e le macro abbreviate @hourly / @daily / @reboot che tutti usano oggi. La sintassi dell'espressione cron si è poi divisa in due percorsi. Il Quartz Scheduler (Java, James House, 1998; donato ad Apache e Terracotta) ha aggiunto un campo secondi iniziale, un opzionale campo anno finale, e gli operatori L (ultimo) / W (giorno feriale) / # (n-esima occorrenza), producendo il cron a sei campi che AWS EventBridge (originariamente CloudWatch Events, 2014) e l'annotazione @Scheduled di Spring hanno poi adottato. Il formato NCronTab usato da Azure Functions (2016) ha messo i secondi per primi ma ha mantenuto cinque campi comportamentali. L'era cloud ha poi standardizzato il formato Vixie a cinque campi come lingua franca: Kubernetes CronJobs (alpha 1.4 nel 2016, GA in 1.21 nel 2021) accettano esattamente cinque campi, così come GitHub Actions (on.schedule.cron, 2019), GCP Cloud Scheduler (2018), e Vercel Cron Jobs (2022). I costruttori visivi di cron, la categoria a cui appartiene questo strumento, sono emersi intorno al 2010-2015: crontab.guru (Christine Dodrill, 2014) è diventato il riferimento più citato, e la libreria cron-descriptor (Brady Holt, originariamente .NET, portata in Java/Python/JS) ha alimentato la maggior parte degli strati di traduzione «cron in inglese semplice» su cui si basano decoder e generatori. Mezzo secolo dopo Bell Labs, gli stessi cinque campi stanno ancora pianificando i backup notturni del mondo.
L'anatomia di un'espressione cron
- Cinque campi, separati da spazi. In ordine:
minuto (0-59) ora (0-23) giorno-del-mese (1-31) mese (1-12) giorno-della-settimana (0-6). L'espressione0 9 * * 1significa «minuto 0, ora 9, qualsiasi giorno-del-mese, qualsiasi mese, giorno della settimana 1 (lunedì)», cioè le 9:00 di ogni lunedì. Il mese è indicizzato a 1;0 0 1 0 *è invalido perché non esiste il mese 0. - I quattro operatori.
*corrisponde a ogni valore nell'intervallo del campo.,elenca valori discreti:0,15,30,45nel campo minuto.-definisce un intervallo:9-17nel campo ora copre dalle 9 alle 17./imposta un passo:*/15in minuti scatta a 0, 15, 30, 45. Questi quattro operatori si combinano liberamente:*/15 8-18 * * 1-5significa «ogni 15 minuti tra le 8 e le 18, solo giorni feriali». - Macro di scorciatoia. Vixie cron e la maggior parte dei parser moderni accettano
@yearly(o@annually, equivalente a0 0 1 1 *),@monthly(0 0 1 * *),@weekly(0 0 * * 0),@daily(o@midnight,0 0 * * *),@hourly(0 * * * *), e lo speciale@reboot(eseguito una volta all'avvio del demone cron). Le piattaforme cloud variano: GitHub Actions e Vercel rifiutano le macro. - Il trabocchetto del passo.
*/Nin un campo con intervallo a-b scatta a a, a+N, a+2N, ..., non necessariamente ogni N unità di tempo dell'orologio.*/7nel campo minuto scatta a 0, 7, 14, 21, 28, 35, 42, 49, 56, poi torna a 0 all'inizio dell'ora successiva, producendo un divario di 4 minuti. La vera pianificazione ogni 7 minuti è impossibile nel cron standard senza un wrapper. - La trappola OR (giorno-del-mese vs giorno-della-settimana). Quando entrambi i campi sono limitati, il cron Unix standard scatta quando uno dei due corrisponde, non entrambi.
0 0 1 * 1non significa «lunedì che cadono il 1°», significa «ogni 1° del mese, più ogni lunedì». La pagina mancrontab(5)è esplicita. Quartz, AWS EventBridge e i timer systemd esprimono tutti «primo lunedì» pulitamente; Vixie cron necessita di un wrapper. - La numerazione del giorno della settimana varia. Linux/Vixie, GitHub Actions, GCP Cloud Scheduler, Kubernetes, Azure NCronTab e Spring 5.3+ usano tutti Domenica = 0 (Vixie accetta anche 7). Quartz e AWS EventBridge usano Domenica = 1.
0 0 * * 1significa quindi «ogni lunedì» su Linux ma «ogni domenica» sotto Quartz. Usate nomi di tre lettere (MON,TUE) quando la portabilità è importante.
Dove si inserisce l'espressione
- cron Linux / macOS. Incollate in
crontab -eseguito dal comando. Nomi (MON,JAN) e macro di scorciatoia (@hourly,@daily,@reboot) sono accettati. ImpostateCRON_TZ=America/New_Yorkin cima al crontab se il server è in UTC ma volete pianificare in ora locale. - Kubernetes CronJob. Impostate
spec.schedulesulla vostra espressione a cinque campi.spec.timeZone(GA in 1.27, marzo 2023) accetta una zona IANA come «Europe/Paris». IncorporareTZ=nella stringa di pianificazione è rifiutato da 1.29 in poi. Usatespec.startingDeadlineSecondsper controllare il comportamento di recupero dopo un'interruzione. - GitHub Actions. Inserite in
on.schedule.cron. Le pianificazioni vengono eseguite in UTC, la cadenza più breve è di 5 minuti (qualsiasi cosa più fine viene silenziosamente arrotondata), e i flussi di lavoro pianificati nei repository pubblici si disabilitano automaticamente dopo 60 giorni di inattività del repository. Le stringhe cron all'interno di YAML devono essere tra virgolette per evitare confusione del parser con il*iniziale. - AWS EventBridge / EventBridge Scheduler. Usa sei campi:
cron(min hr dom mon dow yr). Richiede?sia in giorno-del-mese che in giorno-della-settimana (non entrambi letterali). Gli operatori in stile QuartzL(ultimo),W(giorno feriale), e#(n-esima occorrenza) funzionano tutti qui. Il prodotto Scheduler (2022) ha aggiunto un'espressioneat()separata per timer una tantum. - GCP Cloud Scheduler. Sintassi a cinque campi corrispondente a Linux. La proprietà
timeZoneaccetta una zona IANA. Combinate con Cloud Pub/Sub o target HTTP.retryConfiggestisce errori transitori; il default è nessun tentativo, il che sorprende gli ingegneri che si aspettano semantica almeno-una-volta. - Vercel Cron Jobs. Sintassi a cinque campi in
vercel.json. Entrambi i campi giorno non possono essere impostati contemporaneamente. I piani Hobby limitano la cadenza a giornaliera; i piani Pro consentono oraria. Attiva un HTTP GET al percorso della vostra funzione, il che significa che la funzione deve essere idempotente se il trigger riprova mai.
Standard, dialetti e pietre miliari
- cron AT&T Bell Labs (maggio 1975). L'originale. Cinque campi, nessun crontab per utente, eseguito da
/usr/lib/crontab. Parte di Research Unix Versione 7. La grammatica separata da spazi che tutte le varianti moderne estendono. - Vixie cron (Paul Vixie, 1987). La riscrittura che tutti eseguono. Ha aggiunto i crontab per utente, le macro
@hourly/@daily/@reboot, alias di nomi (MON,JAN), e le variabili d'ambienteMAILTO/CRON_TZ. La maggior parte delle distribuzioni Linux include Vixie cron, dcron, o cronie (un fork Red Hat di Vixie). - Quartz Scheduler (James House, 1998). Libreria Java che ha introdotto il cron a sei campi (con secondi iniziali) e gli operatori
L/W/#. Donata ad Apache e poi Terracotta. L'annotazione@Scheduleddi Spring incorpora la semantica Quartz; Spring 5.3+ ha controversamente cambiato il giorno della settimana da «Domenica=1» di Quartz a «Domenica=0» di Linux, quindi la stessa stringa ora significa giorni diversi sotto versioni diverse. - timer systemd (Lennart Poettering, 2010). Sostituisce cron sulla maggior parte delle distribuzioni Linux moderne. Usa una grammatica diversa (
OnCalendar=Mon..Fri 09:00), supporta pianificazioni sia calendarie sia monotone, registra injournald, può dichiarare dipendenze di servizio, valida consystemd-analyze calendar, e combina precisione tipo cron con recupero tipo anacron tramitePersistent=true. - NCronTab (Azure Functions, 2016). Sei campi con secondi per primi:
{second} {minute} {hour} {day} {month} {day-of-week}. Nessun campo anno. Il fuso orario predefinito è UTC; sovrascrivete con l'impostazione dell'appWEBSITE_TIME_ZONEsui piani Linux App Service. - Sintassi cron AWS EventBridge. Sei campi con anno per ultimo:
cron(min hr dom mon dow yr). Richiede letteralmente?come segnaposto in quello di dom/dow non utilizzato. Supporta QuartzL,W,#. Originariamente CloudWatch Events (2014), rinominato EventBridge nel 2019. - Il problema di portabilità 5-vs-6 campi. Incollare un'espressione a cinque campi Linux in Quartz o Spring produce errori «cron expression must consist of 6 fields»; incollare un'espressione a sei campi in cron Linux produce «bad day-of-week» perché Linux legge la colonna secondi come minuto. L'errore inverso è più pericoloso perché può silenziosamente analizzare ed eseguire sulla pianificazione sbagliata.
- Estensione
H(hash) di Jenkins. Jenkins estende il cron standard conH, che sceglie un valore stabile ma randomizzato per lavoro invece di eseguire ogni lavoro nello stesso istante.H * * * *significa «ogni ora, ma a un minuto diverso per ciascun lavoro», prevenendo il problema della «mandria tonante» quando molti lavori sono pianificati al minuto 0.
Altre domande frequenti
Cinque campi sono uguali a sei o sette?
No. La forma POSIX classica è di cinque campi (minuto, ora, giorno-del-mese, mese, giorno-della-settimana). Quartz e Spring usano sei campi aggiungendo una colonna secondi iniziale, e Quartz accetta un settimo campo anno opzionale. AWS EventBridge usa sempre sei campi che terminano con anno (cron(min hr dom mon dow yr)). Incollare un'espressione a cinque campi in Quartz o Spring solleva un errore di sintassi; incollare un'espressione a sei campi in Linux interpreta silenziosamente i campi in modo errato.
Qual è l'intervallo più piccolo che cron può esprimere?
Ogni minuto (* * * * *) sul cron Unix standard. Non esiste un campo secondi integrato. Scheduler come Quartz o NCronTab ne aggiungono uno se vi serve una cadenza sub-minuto, e i timer systemd possono usare OnUnitActiveSec=30s. GitHub Actions limita la cadenza più breve a 5 minuti, ed EventBridge scatta entro una finestra di 60 secondi dell'ora pianificata, quindi non fate affidamento su cron per precisione in tempo reale rigorosa.
Come eseguo un lavoro l'ultimo giorno del mese?
Il cron standard a cinque campi non ha un operatore nativo «ultimo giorno del mese». Quartz e AWS EventBridge supportano L nel campo giorno-del-mese: 0 0 L * ? scatta a mezzanotte l'ultimo giorno. Su cron Linux puro la soluzione abituale è pianificare giornalmente sui giorni candidati e filtrare il comando: 0 0 28-31 * * [ "$(date +\%d -d tomorrow)" = "01" ] && /path/to/script. I timer systemd lo esprimono direttamente con OnCalendar=*-*-* 00:00:00.
Perché il mio lavoro cron non è stato eseguito quando previsto?
I soliti sospetti, in ordine: (1) il server è in un fuso orario diverso da quello che assumete (verificate con date); (2) PATH non è quello della vostra shell interattiva, quindi un comando funziona al prompt ma fallisce sotto cron (usate percorsi assoluti); (3) l'output è andato in email e l'avete perso (impostate MAILTO="" o reindirizzate a un file di log); (4) il demone cron non è in esecuzione (systemctl status cron); (5) la trappola OR (vedi sopra) sta scattando su giorni extra che non intendevate.
Qual è la differenza tra cron, anacron e timer systemd?
Cron si aspetta che il sistema sia in esecuzione all'ora pianificata e salta silenziosamente i lavori che cadono durante i tempi di inattività: bene per server sempre accesi, male per laptop. Anacron traccia i timestamp di ultima esecuzione per lavoro e recupera i lavori persi dopo un riavvio, al costo di precisione a livello di giorno invece che di minuto. I timer systemd sostituiscono cron sulla maggior parte delle distribuzioni Linux moderne: supportano sia pianificazioni calendarie sia monotone, registrano in journald, possono dichiarare dipendenze di servizio, e usano Persistent=true per combinare precisione tipo cron con recupero tipo anacron.
Come fusi orari e ora legale influiscono su cron?
La maggior parte dei demoni cron interpreta le pianificazioni nel fuso orario del sistema. Sui server cloud questo di solito significa UTC, quindi 0 9 * * * scatta alle 9 UTC, non alle 9 locali. Impostate CRON_TZ=America/New_York in un crontab Linux; Kubernetes usa spec.timeZone; AWS, GCP e Vercel ciascuno accettano una zona IANA esplicita. Durante il passaggio all'ora legale, i lavori pianificati nell'ora saltata vengono eseguiti immediatamente dopo da Vixie cron ma saltati interamente da AWS EventBridge. Il pattern più sicuro è lasciare cron in UTC e convertire all'interno del lavoro.