Espressioni cron
Incolli «15 3 * * 1-5» ed esce che cosa vuol dire, in italiano, con le prossime esecuzioni giorno per giorno nel fuso orario che scegli. Oppure il contrario: componi la pianificazione dai menù e ti porti via l'espressione.
Non ce l'hai? Componila qui
Che dialetto legge questa pagina
Cron non è uno solo, e questa è la prima cosa da sapere: qui si legge il crontab classico a cinque campi (minuto, ora, giorno del mese, mese, giorno della settimana), più la forma a sei campi con i secondi davanti a tutti, quella che scrivono Spring e node-cron, più le scorciatoie @yearly, @monthly, @weekly, @daily, @midnight e @hourly. La domenica si può scrivere 0 oppure 7, e i nomi inglesi delle abbreviazioni (MON, FRI, JAN, DEC) vanno benissimo.
Quello che non è di questo dialetto viene rifiutato con il motivo scritto, invece di essere letto a metà: i simboli di Quartz (il punto interrogativo, la L dell'ultimo giorno, la W del giorno feriale più vicino, il cancelletto della terza domenica), i sette campi di Quartz con l'anno in fondo, e @reboot, che non è un orario ma un evento e quindi non ha nessuna prossima volta da calcolare. Vale anche per un intervallo scritto al contrario, come 5-1: ognuno lo legge a modo suo, e dare una risposta sarebbe peggio che dichiararlo. Se il mestiere di oggi sono le reti invece delle pianificazioni, la pagina giusta è Calcolo subnet.
Il giorno del mese e il giorno della settimana vanno in OPPURE
È la trappola che fa perdere più ore di tutte, e sembra un dettaglio: quando tutti e due i campi dei giorni sono scritti, il crontab classico non li mette in E, li mette in OPPURE. Cioè «0 0 13 * 5» non vuol dire «il tredici del mese, se è venerdì»: vuol dire il tredici del mese, e in più tutti i venerdì. Chi si aspettava una esecuzione al mese se ne ritrova cinque o sei.
La regola vale solo quando sono ristretti tutti e due. Se uno dei due è un asterisco, comanda l'altro e basta, che è il caso normale. Per questo l'elenco qui sopra è la parte che conta davvero: le date le si legge una per una e ci si accorge subito se sono più fitte di quello che si aveva in mente. Quando i due campi sono scritti tutti e due, la pagina lo dice a lettere, perché nessuno se ne accorga per caso.
Perché «*/7» non vuol dire «ogni sette minuti»
Il passo non conta i minuti che passano: riparte da zero a ogni ora. Con «*/7» le esecuzioni cadono ai minuti 0, 7, 14, 21, 28, 35, 42, 49 e 56, e poi si torna al minuto 0 dell'ora dopo: fra le 00:56 e le 01:00 passano quattro minuti, non sette. Su una macchina che fa un lavoro pesante, quei due avvii ravvicinati sono esattamente il momento in cui si accavallano.
Il conto torna quando il passo divide sessanta, cioè 2, 3, 4, 5, 6, 10, 12, 15, 20 e 30: solo in quei casi «ogni N minuti» è una descrizione vera. Sulle ore vale lo stesso ragionamento con ventiquattro, quindi «*/13» non è «ogni tredici ore» ma le ore 0 e 13, con undici ore di vuoto in mezzo. Per questo la frase che leggi qui sopra elenca i minuti veri invece di ripetere il passo: la descrizione comoda è quella che ti fa sbagliare.
L'ora legale, e perché ogni data viene ricontrollata
Il cambio dell'ora è il punto in cui perfino i cron veri non sono d'accordo fra loro, quindi la regola di questa pagina è scritta invece che sottintesa: si ragiona in ora di parete, e se quell'ora quella notte non esiste, perché le lancette saltano avanti, l'esecuzione si salta e viene detto; se invece esiste due volte, perché tornano indietro, si conta una volta sola, la prima. Un cron vero, sulla stessa notte, potrebbe recuperare l'esecuzione saltata o farne partire due.
Per lo stesso motivo ogni data prodotta viene riletta: dall'istante si torna all'ora di parete nel fuso scelto e si ricontrolla campo per campo con un secondo pezzo di codice, scritto apposta in un altro modo. Se il ricontrollo non torna non viene stampato niente, perché una data sbagliata detta con sicurezza è peggio di nessuna data. E se quello che ti serve è solo sapere che ore sono adesso da un'altra parte del mondo, la strada breve è Orologio mondiale.