Vai al contenuto

Sintassi delle espressioni cron

Un'espressione cron è cinque campi che descrivono quando qualcosa dovrebbe essere eseguito. Ogni campo dice quali valori della sua unità sono accettabili, e il lavoro si avvia ogni minuto dove tutti e cinque concordano. Questo è l'intero modello: non c'è nozione di durata, nessun "ogni 90 minuti" e nessuno stato di prossima esecuzione conservato da nessuna parte.

I campi si leggono da sinistra a destra come minuto, ora, giorno del mese, mese, giorno della settimana. Gli esempi in basso sono quelli che le persone effettivamente raggiungono, e ognuno viene analizzato dal suo proprio parser cron di questo sito prima che questa pagina sia costruita.

L'ultima sezione elenca la sintassi che sembra cron ma non è accettata qui: estensioni Quartz e Jenkins, e la forma a sei campi con secondi. Vale la pena riconoscerle, perché un'espressione copiata che usa una di loro semplicemente fallirà.

I cinque campi

7

Una riga cron è composta da cinque campi separati da spazi, quindi il comando. Ogni campo deve essere presente; non c'è modo di ometterne uno.

EspressioneIntervalloSignificato
* * * * *min hod dom mes dowI cinque campi in ordine: minuto, ora, giorno del mese, mese, giorno della settimanaCinque asterischi significa ogni minuto di ogni giorno — l'espressione più lenta possibile.
minute0-59Primo campo
hour0-23Secondo campo, su un orologio a 24 ore
day of month1-31Terzo campoUn giorno che non esiste in un dato mese è semplicemente saltato — 31 si esegue sette volte l'anno, non dodici.
month1-12Quarto campo
day of week0-7Quinto campo, domenica per primoSia 0 che 7 significano domenica, per cui l'intervallo va fino a sette piuttosto che sei.
0 5 13 * 5Quando entrambi i campi dei giorni sono limitati, cron si esegue su uno qualsiasi di essi — non su entrambiQuesto si esegue il 13° e su ogni venerdì, quindi non è "venerdì 13". È l'unica regola del cron che sorprende tutti.

Operatori

10

Gli stessi quattro operatori funzionano in ogni campo; solo i numeri che accettano cambiano.

EspressioneIntervalloSignificato
*Ogni valore che il campo consente
1,15,30Un elenco di valori individuali
9-17Un intervallo inclusivo
*/15Ogni n-esimo valore sull'intero campo*/15 nel campo dei minuti significa :00, :15, :30 e :45 — conta dall'inizio dell'intervallo, non da adesso.
9-17/2Ogni n-esimo valore all'interno di un intervallo
5/10Ogni n-esimo valore da un punto di partenza alla fine del campo
0,30 9-17 * * 1-5Gli operatori si combinano liberamente in qualsiasi campoAlle mezz'ora, tra le nove e le cinque, da lunedì a venerdì.
JAN-DEC1-12Nomi dei mesi, tre lettere, non sensibile alle maiuscole
SUN-SAT0-6Nomi dei giorni, tre lettere, non sensibile alle maiuscole
70Domenica, scritta dall'altro lato

Macro abbreviate

7

Sette nomi che rappresentano un'intera espressione. Sono una comodità del formato del file crontab piuttosto che parte della grammatica dei campi, quindi uno scheduler che legge stringhe cron non necessariamente le accetta.

EspressioneIntervalloSignificato
@hourly0 * * * *All'inizio di ogni ora
@daily0 0 * * *Una volta al giorno a mezzanotte
@midnight0 0 * * *Uguale a @daily
@weekly0 0 * * 0Una volta a settimana, domenica a mezzanotte
@monthly0 0 1 * *Il primo del mese a mezzanotte
@yearly0 0 1 1 *Il primo di gennaio a mezzanotte
@annually0 0 1 1 *Uguale a @yearly

Esempi risolti

14

Leggi uno da destra a sinistra quando smette di avere senso: il campo più grossolano è a destra e decide in quali giorni anche i campi più fini vengono consultati.

EspressioneIntervalloSignificato
* * * * *Ogni minuto
*/5 * * * *Ogni cinque minuti
0 * * * *Ogni ora, all'inizio
0,30 * * * *Ogni mezz'ora
0 3 * * *Ogni giorno alle 03:00
0 9,17 * * *Due volte al giorno, alle 09:00 e 17:00
*/15 9-17 * * 1-5Ogni quarto d'ora durante l'orario di lavoro nei giorni lavorativi
0 8 * * 1-5Nei giorni feriali alle 08:00
0 10 * * 6,0Sabato e domenica alle 10:00
30 7 * * MONLunedì alle 07:30
0 0 1 * *Mezzanotte del primo giorno di ogni mese
0 0 28-31 * *Ogni giorno nella parte finale del meseIl cron standard non conosce "ultimo giorno del mese". Questo si esegue fino a quattro volte; la soluzione solita è uno script che controlla la data e termina presto.
0 0 1 1,4,7,10 *Mezzanotte del primo giorno di ogni trimestre
0 0 1 1 *Una volta all'anno, all'inizio del 1° gennaio

Estensioni che questo sito non accetta

6

Quartz, Jenkins e alcuni scheduler cloud le aggiungono. Sono elencate così riconosci in un crontab altrui — il parser su questo sito rifiuta ognuna, e così fa il cron spedito con Linux.

EspressioneIntervalloSignificato
?"Nessun valore specifico" nel campo dei giorni che l'altro già limita
LL'ultimo giorno del mese, o l'ultimo giorno della settimana dato
15WIl giorno feriale più vicino al 15
FRI#3Il terzo venerdì del mese
*/30 * * * * *Un sesto campo per i secondi, davantiSei campi, non cinque. Quartz e varie librerie linguistiche usano questa forma; il file crontab no.
@rebootEseguire una volta quando la macchina si avviaVero nel crontab, ma non è una pianificazione — non c'è prossima esecuzione da calcolare, ecco perché il parser qui la declina.

FAQ

Perché il mio lavoro "venerdì 13" si esegue ogni venerdì?
Perché quando sia il giorno del mese che il giorno della settimana sono limitati, cron li tratta come un "o" piuttosto che un "e". 0 5 13 * 5 si avvia il 13° e su ogni venerdì. Ottenere un vero venerdì 13 richiede un controllo della data all'interno dello script stesso.
*/5 significa "cinque minuti da ora"?
No. I passi vengono contati dall'inizio dell'intervallo del campo, non dal momento in cui installi il lavoro, quindi */5 nel campo dei minuti significa :00, :05, :10 e così via indipendentemente da quando è stato scritto.
Quale fuso orario usa cron?
Quello del sistema, a meno che il crontab non imposti CRON_TZ o TZ in alto. Questo importa due volte all'anno: un lavoro pianificato durante l'ora che un cambio di ora solare salta non viene eseguito, e uno durante l'ora che si ripete potrebbe eseguirsi due volte.
0 è lo stesso di 7 nel campo del giorno della settimana?
Sì, entrambi sono domenica. Il duplicato esiste così che un intervallo come 1-7 che copre da lunedì a domenica possa essere scritto naturalmente, cosa che un campo 0-6 non può esprimere in un intervallo.
Dove posso testare un'espressione?
Il parser cron su questo sito prende un'espressione e mostra le prossime esecuzioni in linguaggio naturale, localmente nel tuo browser. Lo strumento accanto fa il contrario: scegli una pianificazione e scrive l'espressione.