Skip to main content

Componi un'espressione cron partendo da opzioni semplici, senza memorizzare la sintassi.

Espressione cron

0 2 * * *

Giornaliero — 02:00

Capire i cinque campi

Un'espressione cron ha cinque campi in ordine fisso: minuto, ora, giorno del mese, mese e giorno della settimana. L'asterisco significa «ogni valore», un numero fissa un valore esatto e */N significa «ogni N». Quindi 30 2 * * 1 viene eseguita alle 02:30 ogni lunedì.

Due dettagli traggono spesso in inganno. Nel giorno della settimana la domenica è 0 (e 7 nella maggior parte delle implementazioni), quindi il lunedì è 1. E se imposti sia il giorno del mese sia il giorno della settimana, la maggior parte dei demoni cron esegue il job quando corrisponde uno dei due, non entrambi: lascia uno dei campi come asterisco, a meno che non sia il comportamento voluto.

Perché `0 0 13 * 5` non significa venerdì 13

Un'espressione cron è fatta di cinque campi che descrivono quando un comando viene eseguito. Quasi tutto è ovvio una volta visto. Due cose non lo sono: come si combinano i campi del giorno e su che cosa avanza davvero un valore di passo. Entrambe producono in silenzio pianificazioni che scattano molto più spesso del previsto.

Come funziona

  • Costruisce l'espressione a cinque campi — minuto, ora, giorno del mese, mese, giorno della settimana — da scelte semplici.
  • Mostra le prossime esecuzioni, l'unico modo affidabile per confermare che un'espressione significhi ciò che credi.
  • Rende visibile l'interazione tra giorno del mese e giorno della settimana invece di lasciarla scoprire in produzione.
┌─ minuto        0–59
│ ┌─ ora         0–23
│ │ ┌─ giorno del mese 1–31
│ │ │ ┌─ mese      1–12
│ │ │ │ ┌─ giorno della settimana 0–6 (domenica = 0)
* * * * *

se giorno del mese E giorno della settimana sono entrambi limitati, cron esegue su UNO QUALSIASI

Esempio pratico

Due espressioni che quasi tutti leggono male la prima volta.

  1. `0 0 13 * 5` si legge come "mezzanotte di venerdì 13"
  2. entrambi i campi del giorno sono limitati, quindi cron li unisce con OR
  3. in realtà viene eseguita il 13 di ogni mese E ogni venerdì: circa 64 volte l'anno, non una o due
  4. `0 0 */7 * *` si legge come "ogni sette giorni"
  5. il passo vale nell'intervallo 1–31 e dà il 1, l'8, il 15, il 22 e il 29

La seconda espressione si azzera ogni mese, quindi lo scarto dal 29 al 1 successivo è di tre giorni in un mese di 31, non di sette. Nessuna delle due è settimanale. `0 0 * * 5` è il modo di dire ogni venerdì.

Come leggere il risultato

  • La regola dell'OR vale solo quando entrambi i campi del giorno sono limitati. Se uno è `*`, l'altro si comporta normalmente: per questo la trappola resta nascosta finché qualcuno non li compila entrambi.
  • I passi contano sempre dall'inizio dell'intervallo, non da oggi. `*/7` in un campo che parte da 1 cade su 1, 8, 15, 22, 29 a prescindere dal giorno del rilascio.
  • Cron usa il fuso del sistema o del demone. Un job impostato alle 02:30 può essere eseguito due volte o mai nei giorni di cambio dell'ora; pianificare fuori dalla fascia 01:00–03:00 elimina del tutto la questione.
  • `0` e `7` indicano entrambi domenica nel campo del giorno della settimana su gran parte delle implementazioni, e nomi come `MON` o `JAN` sono ampiamente ma non universalmente supportati.

Domande frequenti

Come pianifico davvero qualcosa ogni sette giorni?
Usa un giorno della settimana: `0 0 * * 5` per ogni venerdì. Se ti serve davvero un intervallo fisso di sette giorni indipendente dal calendario, cron è lo strumento sbagliato: un job che si ripianifica da solo, o un timer con intervallo monotono, lo esprime correttamente.
Che cosa viene eseguito il 31 in un mese corto?
Niente. Cron non slitta al 1, quindi `0 0 31 * *` salta in silenzio febbraio, aprile, giugno, settembre e novembre. Per il lavoro di fine mese, pianifica il 1 e guarda indietro.