Costruire un'espressione cron
- Dashboard
- Documentazione
- API
Perché un cron builder visivo?
Un'espressione cron sta in cinque campi e resta tuttavia una delle maggiori fonti di
bug in produzione. Quante volte uno sviluppatore ha scritto 0 0 * * 1 pensando «tutti i
lunedì», senza ricordare che 1 può significare domenica a seconda delle implementazioni? Quante
volte si è confuso */15 e 15? Il cron builder risponde a questa
esigenza: comporre visivamente una crontab expression, a partire da preset comuni o
da campi individuali, e ottenere l'espressione finale pronta da incollare in una crontab Linux, un Kubernetes
CronJob o uno schedule GitHub Actions.
Lo strumento è l'inverso del nostro cron decoder: dove il converter prende un'espressione e srotola le prossime esecuzioni, il builder prende scelte umane e produce l'espressione cron corrispondente.
Come funziona
L'interfaccia grafica propone due modalità di composizione complementari:
- Modalità preset: un selettore di frequenza (every minute, every hour, every day, every week, every month, every year, custom) che genera immediatamente una cron expression valida.
- Modalità campi: cinque campi modificabili (minuto, ora, giorno del mese, mese, giorno della
settimana) dove inserite liberamente
*, un intero, un intervallo1-5, una lista1,15,30o un passo*/15.
Il builder aggiorna l'espressione in tempo reale e mostra una lettura umana succinta («tutti i giorni alle 3», «ogni 15 minuti») che serve da salvaguardia: se la frase non combacia con la vostra intenzione, l'espressione è probabilmente sbagliata.
I cinque campi cron, in chiaro
Un'espressione cron standard contiene cinque campi separati da spazi:
minute heure jour-du-mois mois jour-de-la-semaine
* * * * *
- minuto (0 a 59);
- ora (0 a 23);
- giorno del mese (1 a 31);
- mese (1 a 12 o abbreviazioni Jan, Feb, ecc.);
- giorno della settimana (0 a 7, 0 e 7 valgono entrambi domenica nella maggior parte delle implementazioni).
Ogni campo accetta diverse forme: * (tutti i valori), un intero preciso
(5), una lista (1,3,5), un intervallo (9-17), un passo (*/15
ogni 15 valori), o una combinazione (0-30/5).
Casi d'uso tipici
- Sviluppatore che impara cron: visualizzare come ogni campo interagisce, senza rischiare un'espressione errata in produzione.
- Sysadmin di fretta: generare in pochi secondi uno schedule per un cron Linux, un Kubernetes CronJob o un job Ansible senza rileggere la man page.
- Sviluppatore senza esperienza POSIX: produrre una crontab expression valida per Symfony Scheduler, Laravel Scheduler o node-cron senza conoscere la sintassi storica.
- DevOps in review: prototipare rapidamente un'espressione da proporre in una pull request, poi validarla con il cron decoder.
- Migrazione legacy: riformulare un'espressione cron storica passando per il builder per assicurarsi della semantica prima di spingerla altrove.
Preset comuni
Selezionare un preset sovrascrive i campi individuali e produce l'espressione corrispondente:
- Ogni minuto:
* * * * *. Da evitare in produzione tranne per esigenze particolari. - Ogni ora:
0 * * * *. A ogni inizio ora. - Tutti i giorni:
0 0 * * *. A mezzanotte. - Tutte le settimane:
0 0 * * 0. Tutte le domeniche a mezzanotte. - Tutti i mesi:
0 0 1 * *. Il 1° del mese a mezzanotte. - Tutti gli anni:
0 0 1 1 *. Il 1° gennaio a mezzanotte.
Pattern comuni da conoscere
| Espressione | Lettura umana |
|---|---|
0 0 * * * |
Tutti i giorni a mezzanotte |
*/15 * * * * |
Ogni 15 minuti |
0 9 * * 1-5 |
Tutti i giorni feriali alle 9 |
0 0 1 * * |
Il 1° del mese a mezzanotte |
0 0 * * 0 |
Tutte le domeniche a mezzanotte |
*/5 9-17 * * 1-5 |
Ogni 5 minuti in orario d'ufficio |
0 3 * * * |
Tutti i giorni alle 3 del mattino |
30 2 1,15 * * |
Il 1° e il 15 del mese alle 2:30 |
Comporre un'espressione personalizzata
Per casi più specifici, l'assistente espone i cinque campi in input libero. Alcuni esempi utili:
- Tutti i giorni alle 3 del mattino: minuto=
0, ora=3, altri campi*. - Ogni 15 minuti: minuto=
*/15, altri campi*. - Dal lunedì al venerdì alle 9: minuto=
0, ora=9, giorno-della-settimana=1-5. - Ogni 1° e 15 del mese a mezzogiorno: minuto=
0, ora=12, giorno-del-mese=1,15. - Ogni 5 minuti tra le 9 e le 17: minuto=
*/5, ora=9-17.
Come usare il cron builder
- Scegliete un preset (every minute, every hour, every day, every week, every month, every year) che corrisponde alla base della vostra esigenza.
- Affinate se necessario modificando direttamente i cinque campi (minuto, ora, giorno del mese, mese, giorno della settimana).
- Leggete la frase umana generata dallo strumento per confermare l'intenzione.
- Copiate l'espressione cron prodotta tramite il pulsante di copia.
- Validate lo schedule con il nostro cron decoder che calcola le prossime date di esecuzione reali.
- Incollate l'espressione nella vostra crontab Linux, nel vostro Kubernetes CronJob, nel vostro Symfony Scheduler o nel vostro workflow GitHub Actions.
Trappole classiche
- Giorno del mese e giorno della settimana combinati: se entrambi non sono
*, il comportamento differisce a seconda delle implementazioni. Linux/Vixie cron applica un OR; le librerie moderne hanno talvolta un comportamento diverso. Da evitare. - Giorno 1 = lunedì o domenica?: a seconda del paese e della convenzione. La maggior parte dei cron Unix considera domenica=0 e sabato=6. Verificate il vostro scheduler.
- Fuso orario: un cron Unix usa per default il fuso del server. Gli scheduler applicativi (Symfony Scheduler, Quartz) permettono spesso di fissare un fuso dedicato.
- Minuto mancante:
* * * * *esegue il job ogni minuto, il che è raramente ciò che si vuole. Pensate a fissare un trigger preciso (0) per le attività orarie.
Lettura umana e output
Oltre all'espressione cron, lo strumento propone una lettura umana succinta («tutti i giorni a mezzanotte», «ogni 5 minuti»). È una salvaguardia: se la frase non corrisponde alla vostra intenzione, l'espressione è probabilmente sbagliata. Per un caso complesso, usate poi il nostro cron decoder per calcolare le prossime date di esecuzione reali.
Domande frequenti
Posso modificare manualmente l'espressione dopo aver usato l'interfaccia?
Sì. Il builder non è una modalità esclusiva: i cinque campi restano modificabili in qualsiasi momento. Potete partire da un preset, poi regolare un campo a mano per ottenere una crontab expression su misura. La lettura umana viene ricalcolata immediatamente.
Lo strumento supporta il formato Quartz a 6 campi (con secondi)?
No: il formato a 5 campi è lo standard Unix e la base comune alla maggior parte degli scheduler
(Linux crontab, Kubernetes CronJob, GitHub Actions, GitLab CI, Symfony Scheduler, Laravel Scheduler).
Quartz (Java) accetta un campo aggiuntivo per i secondi e simboli specifici
(?, L, W, #), ma questa esigenza resta rara.
Come viene gestito il fuso orario?
Il builder produce un'espressione cron neutra: è il motore che esegue il job ad applicare il proprio
fuso orario. Su una crontab Linux, è la TZ del server. Su GitHub Actions, è UTC. Su
Kubernetes 1.27+, potete fissare spec.timeZone nel manifest. Symfony Scheduler e
Quartz espongono un fuso dedicato per ogni attività.
Come validare la mia espressione senza eseguirla in produzione?
Usate il nostro cron decoder. Calcola le N prossime esecuzioni a partire dall'istante corrente, senza avviare alcun job. È il modo migliore per confermare che una cron expression scatti all'ora prevista prima di deployarla.
Qual è il rapporto con Symfony Scheduler?
Symfony Scheduler accetta le espressioni cron a 5 campi tramite Schedule::cron('0 3 * * *', ...)
. L'espressione prodotta dal builder può quindi essere incollata così com'è. Idem per Laravel
Scheduler (->cron('...')), node-cron, Hangfire e Airflow.
Bisogna prefissare il comando nella crontab di sistema?
Sì, in /etc/crontab serve un utente (0 3 * * * www-data /usr/bin/php
...), mentre crontab -e per utente lo omette. L'espressione stessa resta
identica.
Esempio di richiesta
curl -X POST https://cdrn.fr/api/v1/tools/cron-builder/execute \
-H "Content-Type: application/json" \
-d '{"preset":"none","minute":"*","hour":"*","day_of_month":"*","month":"*","day_of_week":"*"}'
Schema di input
| Campo | Tipo | Richiesto | Predefinito |
|---|---|---|---|
preset |
choice (none, every_minute, hourly, daily, weekly, monthly, yearly) | – | none |
minute |
string | – | * |
hour |
string | – | * |
day_of_month |
string | – | * |
month |
string | – | * |
day_of_week |
string | – | * |
Endpoint
GET https://cdrn.fr/api/v1/tools- elenca tutti gli strumenti disponibiliGET https://cdrn.fr/api/v1/tools/cron-builder- recupera lo schema di questo strumentoPOST https://cdrn.fr/api/v1/tools/cron-builder/execute- esegue questo strumento con un payload JSON