Espressioni cron svelate: Programma qualsiasi cosa
Devi eseguire un backup del database ogni notte alle 3 di mattina. O inviare un report ogni lunedì mattina. O svuotare una cache ogni 15 minuti. Su server Linux e Unix, lo strumento per questo è cron, e il modo in cui dici a cron quando eseguire qualcosa è con un'espressione cron.
Le espressioni cron sembrano intimidatorie a prima vista. 0 3 * * * o */15 9-17 * * 1-5 possono sembrare incomprensibili se non conosci lo schema. Ma la sintassi è sorprendentemente semplice una volta compresi i cinque campi.
I cinque campi
Ogni espressione cron standard ha esattamente cinque campi, separati da spazi. Ogni campo rappresenta un'unità di tempo:
┌───────────── minuto (0-59)
│ ┌───────────── ora (0-23)
│ │ ┌───────────── giorno del mese (1-31)
│ │ │ ┌───────────── mese (1-12)
│ │ │ │ ┌───────────── giorno della settimana (0-7, dove 0 e 7 sono domenica)
│ │ │ │ │
* * * * *
Tutto qui. Cinque campi, da sinistra a destra: minuto, ora, giorno del mese, mese, giorno della settimana.
Lo sapevi? Il nome "cron" viene dalla parola greca "chronos," che significa tempo. Il demone cron (processo in background) è parte integrante dei sistemi operativi Unix-like dal 1975.
I caratteri speciali
Asterisco (*) — Ogni valore
Un asterisco significa "ogni valore possibile" per quel campo.
* * * * * = ogni minuto di ogni ora di ogni giorno.
Virgola (,) — Valori multipli
Una virgola separa i valori individuali.
0 9,12,18 * * * = al minuto 0 delle ore 9, 12 e 18 (9:00, 12:00, 18:00).
Trattino (-) — Intervallo di valori
Un trattino definisce un intervallo.
0 9-17 * * * = al minuto 0 di ogni ora dalle 9 alle 17 (dalle 9:00 alle 17:00, ogni ora).
Barra (/) — Valori a step
Una barra definisce gli intervalli.
*/15 * * * * = ogni 15 minuti (minuto 0, 15, 30, 45 di ogni ora).
0 */2 * * * = ogni 2 ore al minuto 0 (mezzanotte, 2:00, 4:00, ...).
Leggere le espressioni cron: Pratica
Analizziamo alcuni esempi comuni. Per ognuno, leggi i cinque campi da sinistra a destra.
0 3 * * * — Ogni giorno alle 3:00
| Campo | Valore | Significato |
|---|---|---|
| Minuto | 0 | Al minuto 0 |
| Ora | 3 | Dell'ora 3 (3:00) |
| Giorno del mese | * | Ogni giorno |
| Mese | * | Ogni mese |
| Giorno della settimana | * | Ogni giorno della settimana |
Traduzione: "Alle 3:00 di ogni giorno." La scelta classica per i backup notturni.
*/15 * * * * — Ogni 15 minuti
| Campo | Valore | Significato |
|---|---|---|
| Minuto | */15 | Ogni 15 minuti |
| Ora | * | Ogni ora |
| Giorno del mese | * | Ogni giorno |
| Mese | * | Ogni mese |
| Giorno della settimana | * | Ogni giorno |
Traduzione: "Ogni 15 minuti, 24 ore su 24." Comune per controlli di salute e aggiornamenti della cache.
0 9 * * 1-5 — Giorni feriali alle 9:00
| Campo | Valore | Significato |
|---|---|---|
| Minuto | 0 | Al minuto 0 |
| Ora | 9 | Dell'ora 9 |
| Giorno del mese | * | Ogni giorno |
| Mese | * | Ogni mese |
| Giorno della settimana | 1-5 | Da lunedì a venerdì |
Traduzione: "Alle 9:00, dal lunedì al venerdì." Perfetto per i report di lavoro giornalieri.
0 0 1 * * — Primo giorno di ogni mese
| Campo | Valore | Significato |
|---|---|---|
| Minuto | 0 | Al minuto 0 |
| Ora | 0 | Dell'ora 0 (mezzanotte) |
| Giorno del mese | 1 | Il primo |
| Mese | * | Ogni mese |
| Giorno della settimana | * | Qualsiasi giorno della settimana |
Traduzione: "A mezzanotte del primo giorno di ogni mese." Usato per report mensili, fatturazione o pulizie.
30 8 * * 1 — Lunedì alle 8:30
| Campo | Valore | Significato |
|---|---|---|
| Minuto | 30 | Al minuto 30 |
| Ora | 8 | Dell'ora 8 |
| Giorno del mese | * | Ogni giorno |
| Mese | * | Ogni mese |
| Giorno della settimana | 1 | Lunedì |
Traduzione: "Alle 8:30 di ogni lunedì." Ottimo per le notifiche settimanali del team.
Scrivere le proprie espressioni cron
Ecco un approccio sistematico:
- Inizia con il quando. "Ogni giorno alle 3 di mattina" o "ogni 5 minuti durante l'orario di lavoro."
- Compila i campi da sinistra a destra. Inizia con il minuto, poi l'ora, poi il giorno del mese, poi il mese, poi il giorno della settimana.
- Usa
*per "ogni." Se non ti interessa un campo, usa*. - Testa prima di applicare. Verifica sempre che la tua espressione produca la programmazione che ti aspetti.
Riferimento rapido per schemi comuni
| Programmazione | Espressione |
|---|---|
| Ogni minuto | * * * * * |
| Ogni 5 minuti | */5 * * * * |
| Ogni ora | 0 * * * * |
| Ogni giorno a mezzanotte | 0 0 * * * |
| Ogni giorno alle 3:00 | 0 3 * * * |
| Ogni lunedì alle 9:00 | 0 9 * * 1 |
| Giorni feriali alle 8:30 | 30 8 * * 1-5 |
| Primo di ogni mese | 0 0 1 * * |
| Ogni 15 min, orario di lavoro | */15 9-17 * * 1-5 |
| Due volte al giorno (9:00 e 18:00) | 0 9,18 * * * |
| Ogni domenica alle 2:00 | 0 2 * * 0 |
Errori comuni
Dimenticare che le ore vanno da 0 a 23
L'ora 13 è le 13:00, non l'una. Un errore comune è scrivere 0 1 * * * pensando che si esegua alle 13:00 quando in realtà si esegue all'1:00 di notte.
Confusione sul giorno della settimana
La domenica può essere 0 o 7 (entrambi sono validi). Il lunedì è 1, il sabato è 6. Alcune persone si aspettano che il lunedì sia 0.
Interazione tra giorno del mese e giorno della settimana
Se specifichi sia il giorno del mese che il giorno della settimana (nessuno dei due è *), la maggior parte delle implementazioni cron esegue il job quando una qualsiasi delle condizioni è soddisfatta, non quando entrambe lo sono. Questo coglie di sorpresa molte persone.
Attenzione L'espressione 0 9 15 * 1 NON significa "alle 9 del 15, ma solo se è lunedì." Significa "alle 9 del 15 di ogni mese E alle 9 di ogni lunedì." Questa è una fonte comune di comportamenti inattesi.
Consapevolezza del fuso orario
Cron funziona nel fuso orario locale del server. Se il tuo server è in UTC e tu sei a Roma (UTC+1), un job cron 0 9 * * * si esegue alle 10:00 del tuo orario. Controlla sempre il fuso orario del tuo server.
Suggerimento Testa e visualizza le tue espressioni cron prima di applicarle: Come leggere e testare le espressioni cron. Visualizza le prossime esecuzioni e conferma che la programmazione corrisponda a ciò che intendi.
Crea e testa le tue espressioni cron:
Gratuito, istantaneo e senza registrazione.