Cheat Sheet Espressioni Cron โ Pianifica i Job come un Professionista
Cron รจ la spina dorsale dell'automazione delle attivitร pianificate sui sistemi Unix-like. Che tu stia ruotando i log, eseguendo backup del database o attivando pipeline CI/CD, le espressioni cron definiscono quando quei job vengono eseguiti. La sintassi รจ compatta ma potente โ e facile da sbagliare se vai per tentativi.
Questo riferimento copre ogni parte della sintassi cron con esempi pratici pronti da copiare e incollare. Se vuoi costruire e validare espressioni in modo interattivo, apri il Costruttore di Espressioni Cron accanto a questa guida.
Sintassi Cron: I cinque campi
Un'espressione cron standard รจ composta da cinque campi separati da spazi:
โโโโโโโโโโโโโโ minuto (0โ59)
โ โโโโโโโโโโโโโโ ora (0โ23)
โ โ โโโโโโโโโโโโโโ giorno del mese (1โ31)
โ โ โ โโโโโโโโโโโโโโ mese (1โ12)
โ โ โ โ โโโโโโโโโโโโโโ giorno della settimana (0โ7, dove 0 e 7 = Domenica)
โ โ โ โ โ
* * * * *
Ogni campo accetta un valore specifico, un intervallo, una lista o un carattere jolly. Insieme, i cinque campi specificano una pianificazione ricorrente esatta.
| Campo | Valori consentiti | Caratteri speciali |
|---|---|---|
| Minuto | 0โ59 | * , - / |
| Ora | 0โ23 | * , - / |
| Giorno del mese | 1โ31 | * , - / |
| Mese | 1โ12 | * , - / |
| Giorno della settimana | 0โ7 | * , - / |
I campi mese e giorno della settimana accettano anche abbreviazioni di tre lettere (JANโDEC, SUNโSAT) nella maggior parte delle implementazioni.
Caratteri speciali spiegati
Comprendere quattro caratteri speciali sblocca tutta la potenza di cron:
Asterisco * โ "Ogni"
Corrisponde a ogni valore possibile per quel campo.
* * * * * # Ogni minuto di ogni ora di ogni giorno
Virgola , โ "E"
Specifica una lista di valori discreti.
0 9,12,18 * * * # Alle 9:00, 12:00 e 18:00 ogni giorno
Trattino - โ "Fino a"
Definisce un intervallo inclusivo.
0 9-17 * * * # Ogni ora dalle 9 alle 17
Barra / โ "Ogni n-esimo"
Imposta un intervallo di passo dall'inizio dell'intervallo.
*/10 * * * * # Ogni 10 minuti (0, 10, 20, 30, 40, 50)
Puoi combinare un intervallo con un passo:
0 9-17/2 * * * # Ogni 2 ore dalle 9 alle 17 (9, 11, 13, 15, 17)
Esempi comuni di pianificazione Cron
Salva questa tabella nei preferiti. Queste sono le pianificazioni che userai piรน e piรน volte.
| Pianificazione | Espressione | Spiegazione |
|---|---|---|
| Ogni minuto | * * * * * | Si esegue all'inizio di ogni minuto |
| Ogni 5 minuti | */5 * * * * | Minuti 0, 5, 10, 15, โฆ, 55 |
| Ogni 15 minuti | */15 * * * * | Minuti 0, 15, 30, 45 |
| Ogni ora | 0 * * * * | Al minuto 0 di ogni ora |
| Ogni 6 ore | 0 */6 * * * | Alle 00:00, 06:00, 12:00, 18:00 |
| Ogni giorno a mezzanotte | 0 0 * * * | Una volta al giorno alle 00:00 |
| Ogni giorno alle 3 | 0 3 * * * | Una volta al giorno alle 03:00 |
| Ogni lunedรฌ alle 9 | 0 9 * * 1 | Settimanale il lunedรฌ alle 09:00 |
| Ogni giorno feriale alle 8 | 0 8 * * 1-5 | Da lunedรฌ a venerdรฌ alle 08:00 |
| Ogni fine settimana a mezzogiorno | 0 12 * * 0,6 | Sabato e domenica alle 12:00 |
| Primo di ogni mese | 0 0 1 * * | Mezzanotte il 1ยฐ di ogni mese |
| Ogni trimestre (Gen, Apr, Lug, Ott) | 0 0 1 1,4,7,10 * | Mezzanotte il 1ยฐ dei mesi trimestrali |
| Ogni 15 min in orario lavorativo | */15 9-17 * * 1-5 | Giorni feriali, 9โ17, ogni 15 minuti |
Incolla qualsiasi espressione nel Costruttore di Espressioni Cron per visualizzare i prossimi momenti di esecuzione.
Pattern avanzati
Combinare liste e intervalli
I campi accettano sintassi mista. Per eseguire un job alle 8 e alle 18 nei giorni feriali:
0 8,18 * * 1-5
Per puntare a mesi specifici con un passo:
0 0 1 1-12/3 * # Ogni 3 mesi a partire da gennaio (Gen, Apr, Lug, Ott)
Giorno del mese vs. Giorno della settimana
Quando sia il giorno del mese che il giorno della settimana sono impostati (non *), il comportamento dipende dall'implementazione. Nel cron standard, il job si esegue se una delle due condizioni รจ soddisfatta โ รจ una relazione OR, non AND. Questo sorprende molte persone.
0 0 15 * 1 # Si esegue il 15 E ogni lunedรฌ โ non "il lunedรฌ 15"
Esecuzione all'avvio
Pur non essendo un'espressione cron in senso stretto, @reboot รจ una scorciatoia ampiamente supportata:
@reboot /usr/local/bin/start-service.sh
Altre scorciatoie comuni:
| Scorciatoia | Equivalente |
|---|---|
@yearly | 0 0 1 1 * |
@monthly | 0 0 1 * * |
@weekly | 0 0 * * 0 |
@daily | 0 0 * * * |
@hourly | 0 * * * * |
Cron in diversi ambienti
La sintassi a cinque campi รจ universale, ma come si configura cron varia in base alla piattaforma.
Crontab Linux
Il classico. Modifica il tuo crontab utente con crontab -e:
# Esegui backup ogni giorno alle 2
0 2 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1
I job cron di sistema in /etc/cron.d/ includono un campo utente aggiuntivo:
0 2 * * * root /usr/local/bin/cleanup.sh
GitHub Actions
GitHub Actions usa la stessa sintassi a cinque campi in un trigger schedule. Tutti gli orari sono in UTC.
on:
schedule:
- cron: '0 3 * * 1-5' # Giorni feriali alle 3 UTC
Per un approfondimento sulla configurazione YAML, consulta YAML per Kubernetes e YAML per Docker Compose.
Kubernetes CronJob
Kubernetes incapsula le espressioni cron in una risorsa CronJob:
apiVersion: batch/v1
kind: CronJob
metadata:
name: nightly-report
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: report
image: reporting:latest
command: ["python", "generate_report.py"]
restartPolicy: OnFailure
Kubernetes usa UTC per impostazione predefinita. A partire dalla v1.25, puoi impostare timeZone: "America/New_York" nella specifica del CronJob.
AWS CloudWatch (EventBridge)
AWS usa una sintassi leggermente diversa con sei campi (aggiungendo i secondi) e i wrapper rate() / cron():
cron(0 3 * * ? *) # Ogni giorno alle 3 UTC
Nota il carattere ? โ AWS lo richiede per il giorno del mese o il giorno della settimana quando l'altro รจ specificato. Questo รจ diverso dal cron standard.
Errori comuni
1. Confusione sui fusi orari
Cron usa il fuso orario del sistema su Linux, ma Kubernetes e GitHub Actions funzionano in UTC. Un job pianificato per 0 9 * * * si attiverร alle 9 UTC, che corrisponde alle 10 ora italiana.
Verifica sempre quale fuso orario usa il tuo scheduler. Per le conversioni di timestamp, la nostra guida Timestamp Unix spiegato copre gli offset UTC in dettaglio.
2. Esecuzioni sovrapposte
Se un job impiega piรน tempo dell'intervallo tra le esecuzioni, otterrai istanze sovrapposte. Uno script che gira per 8 minuti con una pianificazione */5 * * * * si accumulerร .
Soluzioni:
- Usa un file di blocco (
flocksu Linux) - Imposta
concurrencyPolicy: Forbidnei CronJob di Kubernetes - Controlla le istanze in esecuzione all'inizio del tuo script
3. Output mancante e debug
Cron non cattura stdout per impostazione predefinita. Reindirizza sempre l'output:
*/5 * * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
Se un job cron non si esegue, controlla:
grep CRON /var/log/syslogper i log di esecuzione- I permessi del file dello script
- La variabile d'ambiente
PATHโ cron ha unPATHminimale per impostazione predefinita
4. La trappola del "31 di ogni mese"
0 0 31 * * # Si esegue solo nei mesi con 31 giorni
Questo si esegue a gennaio, marzo, maggio, luglio, agosto, ottobre e dicembre โ ma salta silenziosamente gli altri cinque mesi. Se hai bisogno di un job di fine mese, considera di eseguirlo il 1ยฐ e adattare la logica del tuo script, o usa uno strumento che supporti la semantica "ultimo giorno del mese".
5. Dimenticare il ritorno a capo alla fine del crontab
Alcune implementazioni di cron richiedono un ritorno a capo alla fine del file crontab. Se la tua ultima voce non si esegue, aggiungi una riga vuota alla fine.
Costruire espressioni visivamente
Memorizzare la sintassi funziona per i pattern comuni, ma le pianificazioni complesse sono piรน facili da costruire visivamente. Il Costruttore di Espressioni Cron su alltools.one ti permette di:
- Selezionare valori per ogni campo tramite menu a tendina
- Vedere una descrizione leggibile della pianificazione
- Visualizzare in anteprima i prossimi momenti di esecuzione
- Copiare l'espressione finale con un clic
Funziona interamente nel tuo browser โ nessun dato viene inviato a un server.
Scheda di riferimento rapido
Copia questo blocco nella documentazione del tuo progetto o nel wiki del team:
# โโโโโโ min (0-59)
# โ โโโโโโ ora (0-23)
# โ โ โโโโโโ giorno del mese (1-31)
# โ โ โ โโโโโโ mese (1-12)
# โ โ โ โ โโโโโโ giorno della settimana (0-7, Dom=0 o 7)
# โ โ โ โ โ
# * * * * *
*/5 * * * * # Ogni 5 minuti
0 * * * * # Ogni ora
0 0 * * * # Ogni giorno a mezzanotte
0 9 * * 1-5 # Giorni feriali alle 9
0 0 1 * * # Primo del mese
*/15 9-17 * * 1-5 # Ogni 15 min, orario lavorativo
Letture aggiuntive
- Timestamp Unix spiegato โ Comprendere il tempo epoch e le conversioni di fuso orario
- YAML per Kubernetes โ Configurare CronJob e altre risorse Kubernetes
- YAML per Docker Compose โ Pianificare container nelle configurazioni compose
Pronto a costruire la tua prossima espressione cron? Apri il Costruttore di Espressioni Cron e imposta la tua pianificazione correttamente al primo tentativo.