cron · pianificazione · unix
Che cos'è cron, esattamente?
Una voce cron è cinque campi temporali e un comando. Nell'ordine: minuto, ora, giorno del mese, mese, giorno della settimana.
30 4 * * 1 /usr/local/bin/backup.sh Si legge: minuto 30, ora 4, qualsiasi giorno del mese, qualsiasi mese, giorno della settimana 1. Le quattro e mezza del mattino, il lunedì.
Il vocabolario di un campo
Ogni campo accetta più di un singolo numero. * significa ogni valore. 1-5 è un intervallo. 1,15 è un elenco. */15 è un passo: un valore ogni quindici, quindi quattro volte l'ora nel campo dei minuti.
Due campi accettano anche nomi: i mesi da JAN a DEC, i giorni della settimana da SUN a SAT. E il campo del giorno della settimana ha una stranezza nota: sia 0 sia 7 indicano la domenica nella maggior parte delle implementazioni.
Il campo che è un OR
Ecco la parte che sorprende, e merita una seconda lettura.
Giorno del mese e giorno della settimana sono due modi diversi di nominare lo stesso giorno. Se ne compili uno solo e lasci l'altro a *, cron si comporta esattamente come ti aspetti. Se li compili entrambi, POSIX specifica che un giorno corrispondente a uno qualsiasi dei due campi fa scattare il processo.
È un OR, non un AND.
Quindi 0 0 1 * 1 non significa «il primo del mese, se è lunedì». Significa il primo di ogni mese, e ogni lunedì: all'incirca cinque volte le esecuzioni previste.
Il ragionamento dietro la scelta regge. Un AND farebbe scattare quasi mai la maggior parte delle combinazioni: «il 31 quando cade di venerdì» capita una o due volte l'anno. L'OR consente a una sola riga di esprimere «mensile e settimanale» senza una seconda voce. Ma è l'opposto di ciò che la sintassi lascia intendere, ed è lì che i processi pianificati girano in silenzio nei giorni sbagliati.
Le scorciatoie, e perché non sono portabili
Molte implementazioni accettano @daily, @hourly, @weekly, @monthly e @reboot. Sono comode e non fanno parte di POSIX: vengono da Vixie cron e dai suoi discendenti.
Su una macchina che controlli, poco importa. In qualcosa che deve girare ovunque - un'immagine di container, uno script che distribuisci - i cinque campi espliciti sono la scelta sicura. @reboot in particolare non ha alcun equivalente nello standard, e il suo comportamento dipende interamente dall'implementazione.
Che cosa cron non fa
Non recupera. Se la macchina era spenta alle 4:30, il processo delle 4:30 non è girato e non verrà rilanciato. Cron scatta sulla corrispondenza dell'orologio, non tiene una coda del lavoro perso.
Non ti dà il tuo ambiente di login. Un processo cron gira con un PATH minimo e nulla del tuo profilo di shell. Il «funziona nel mio terminale ma non in cron» più comune è un comando trovato tramite un PATH che cron non ha. Usa percorsi assoluti.
Non impedisce la sovrapposizione. Se un processo pianificato ogni cinque minuti ne impiega sei, ottieni due copie in esecuzione. Cron avvierà comunque la successiva; il file di lock è affar tuo, non suo.
Non ti dice che è fallito. L'output va per posta se la posta è configurata, e nel nulla se non lo è. Reindirizza su un file di log e guardalo, oppure lo scoprirai dal backup mancante.
Leggi l'espressione prima di fidartene
Poiché l'OR è invisibile nella sintassi, un'espressione dall'aria giusta può essere sbagliata in un modo che si manifesta solo settimane dopo. Decodificarla campo per campo prima di distribuire costa pochi secondi: è a questo che serve il decodificatore di espressioni cron di questo sito.
Un calendario con i nomi dei giorni di lato e i numeri nella griglia. Cron ha un campo per ciascuno, e quando li compili entrambi corrisponde all'uno O all'altro, non a entrambi insieme.