Come si legge una riga di crontab

Un'espressione cron ha cinque campi: minuto (0-59), ora (0-23), giorno del mese (1-31), mese (1-12) e giorno della settimana (0-7, dove 0 e 7 sono domenica). L'asterisco vuol dire «qualsiasi», la virgola separa più valori, il trattino indica un intervallo e la barra un passo: */15 nei minuti significa 0, 15, 30 e 45.

Così 0 9 * * 1-5 lancia il job alle 9:00 dal lunedì al venerdì, 30 2 1 * * alle 2:30 del primo giorno di ogni mese, */10 * * * * ogni dieci minuti. Le macro sono abbreviazioni: @daily equivale a 0 0 * * *, @hourly a 0 * * * *, @weekly a 0 0 * * 0.

C'è un'eccezione che sorprende molti: se sia il giorno del mese sia il giorno della settimana sono diversi da *, cron esegue il job quando è vero uno dei due. 0 12 1 * 1 non vuol dire «il primo del mese se è lunedì», ma «ogni primo del mese e ogni lunedì».

Errori frequenti

  • Scrivere * * * * * pensando a «una volta al giorno»: significa ogni minuto.
  • Dimenticare che cron usa il fuso orario del server, non quello di chi guarda: le prossime esecuzioni qui sono nel fuso del tuo browser.
  • Aspettarsi un job il 31 di ogni mese: nei mesi di 30 giorni e a febbraio semplicemente non parte.

Domande frequenti

Cron supporta i secondi?

Il cron classico no: la risoluzione minima è il minuto. Alcuni sistemi, come Quartz o Spring, aggiungono un sesto campo per i secondi, ma la sintassi è diversa.

Che cosa succede con l'ora legale?

Nella notte in cui l'orologio va avanti, un job alle 2:30 può essere saltato; quando torna indietro può partire due volte. Per questo i job importanti si pianificano fuori dalla fascia 2-3 o in UTC.

Posso usare i nomi dei giorni e dei mesi?

Sì: MON-FRI per i giorni e JAN-DEC per i mesi, in inglese e senza distinzione fra maiuscole e minuscole.

Come funziona questo calcolo

Ogni campo viene espanso nell'insieme dei valori ammessi: * è l'intero intervallo, a-b un intervallo, x/n i valori da x in poi a passi di n, e le liste separate da virgole si uniscono. Nel giorno della settimana 7 diventa 0 (domenica). Un giorno è valido se il mese è ammesso e, quando entrambi i campi dei giorni sono ristretti, se lo è il giorno del mese oppure quello della settimana. Le prossime esecuzioni si cercano giorno per giorno, fino a otto anni avanti, nel fuso orario del browser.