crontab
Nei sistemi operativi Unix e Unix-like, il comando cron
consente la pianificazione di comandi, ovvero consente la registrazione di questi presso il sistema per essere poi mandati in esecuzione periodicamente in maniera automatica dal sistema stesso. Lo stesso nome «crontab» si riferisce anche ai file utilizzati dal comando crontab come «registri» dei comandi pianificati.
Generalmente, crontab
usa un demone, chiamato crond
, che in quanto tale è costantemente in esecuzione in background e, una volta al minuto, legge i contenuti del registro dei comandi pianificati ed esegue quelli per cui si è esaurito il periodo di attesa. Un comando mandato in esecuzione da crontab
viene chiamato cronjob.
I file crontab
modificaI file crontab contengono la lista dei job e altre istruzioni per il demone di cron. Gli utenti possono avere dei file crontab individuali e spesso ci sono dei file crontab a livello di sistema (solitamente in /etc
o in una sottodirectory di /etc
) che possono essere utilizzati, ma modificati solo dagli amministratori di sistema.
Ogni linea di un file crontab segue un formato particolare, composta da una serie di campi separati da spazi o tabulazioni. I campi possono avere un solo valore o una serie di valori.
Operatori
modificaEsistono diversi modi per specificare valori multipli in un campo:
- L'operatore virgola
,
specifica una lista di valori, ad esempio:1,3,4,7,8
. - L'operatore trattino
-
specifica un intervallo di valori, ad esempio:1-6
, che equivale a1,2,3,4,5,6
. - L'operatore asterisco
*
specifica tutti i possibili valori di un campo. Ad esempio, un asterisco nel campo dell'ora è equivalente a «ogni ora».
Esiste anche un operatore supportato da alcune versioni estese del cron
, l'operatore barra /
, che può essere usato per saltare un certo numero di valori. Ad esempio, */3
nel campo dell'ora equivale a 0,3,6,9,12,15,18,21
; l'operatore *
specifica «ogni ora», ma il /3
indica che solo il primo, quarto, settimo e così via dei valori restituiti da *
vengano usati.
Campi
modificaI primi cinque campi su ogni riga specificano con che frequenza e quando eseguire un comando.
# .---------------- [m]inute: minuto (0 - 59) # | .------------- [h]our: ora (0 - 23) # | | .---------- [d]ay of month: giorno del mese (1 - 31) # | | | .------- [mon]th: mese (1 - 12) OPPURE jan,feb,mar,apr... # | | | | .---- [w]eek day: giorno della settimana (0 - 6) (domenica=0 o 7) # | | | | | OPPURE sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * comando da eseguire
Note:
- Per «giorno della settimana» (5º campo), sia 0 che 7 sono considerati il valore domenica.
- Se sia «giorno del mese» (3º campo) che «giorno della settimana» (5º campo) sono presenti sulla stessa linea, il comando viene eseguito quando almeno uno dei due è vero. Vedere l'esempio sotto.
Il sesto campo e i successivi (ossia, il resto della linea) specificano il comando da eseguire.
Esempi
modificaCrontab per utente adm su un sistema AIX
modifica#================================================================= # GENERAZIONE RAPPORTI ATTIVITA' DI SISTEMA # Tra le 8 e le 17 un rapporto ogni 20 minuti nei giorni feriali. # Un rapporto ogni ora di sabato e domenica. # Tra le 18 e le 7 un rapporto ogni ora nei giorni feriali. # Genera un riassunto alle 18:05 di ogni giorno feriale. #================================================================= 0,20,40 8-17 * * 1-5 /usr/lib/sa/sa1 1200 3 & 0 * * * 0,6 /usr/lib/sa/sa1 & 0 18-7 * * 1-5 /usr/lib/sa/sa1 & 5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 3600 -ubcwyaq
Errori ricorrenti
modifica#Preparazione al cambio d'ora legale/solare 59 1 1-7 4 0 /root/shift_my_times.sh
Ad una prima occhiata si potrebbe pensare che questa linea di configurazione prepari il lancio dello script shift_my_times.sh
alle 01:59 della prima domenica di aprile. Questo, tuttavia, non è corretto.
Diversamente dagli altri campi, il terzo e il quinto vengono valutati con un'operazione OR se nel terzo sono presenti valori numerici espliciti - mentre con un'operazione AND se sono presenti solo operatori *
, /
e ,
. Di conseguenza lo script sarà eseguito alle 01:59 ogni giorno dal 1º aprile al 7 aprile e in aggiunta ogni altra domenica di aprile.
Il codice corretto sarebbe:
#Preparazione al cambio d'ora legale/solare 59 1 1-7 4/12 ? /root/shift_my_times.sh
Un altro errore comune è quello di inserire caratteri %
nel comando da eseguire: devono essere scritti con il relativo escape, in quanto il carattere %
in denota una nuova linea.
#Errore 1 2 3 4 5 touch ~/errore_`date "+%Y%m%d"`.txt #Corretto 1 2 3 4 5 touch ~/corretto_`date +\%Y\%m\%d`.txt
In questo esempio il carattere %
denota l'inizio del STDIN per il comando cat:
* * * * * cat - % trascorso un minuto
Un altro errore ancora è di non andare a capo dopo l'ultima riga ("carriage return"). In questo caso l'ultima riga non viene considerata.
Valori non standard
modificaMolti sviluppatori tendono a pianificare delle operazioni di notte, tempo in cui i sistemi ovviamente sono meno usati. In quanto umani però non distribuiscono uniformemente le operazioni nel tempo disponibile, quindi molte operazioni iniziano contemporaneamente, rendendo meno efficiente lo sfruttamento del sistema. Infatti, si tende spesso ad usare orari "tondi" (minuto 0: le 23:00, mezzanotte ecc.), mezze ore (minuto: 30) o generalizzando, multipli del quarto d'ora o di 10 minuti; raramente si pensa di avviare un'operazione alle 04:08. Per ovviare a ciò, l'implementazione di cron del sistema Jenkins permette di usare il simbolo speciale "H" che permette di delegare alla macchina la decisione del valore numerico, per meglio distribuire nel tempo le operazioni. Si può anche specificare un intervallo, ad esempio:
# H H(1-4) * * * comando da eseguire
esegui ogni giorno in un minuto qualsiasi tra l'una e le quattro. L'orario non viene ricalcolato ad ogni esecuzione: scelta l'ora per la prima esecuzione in modo automatico, ogni riesecuzione avverrà sempre alla medesima ora[senza fonte].
Disabilitare l'Email di notifica
modificaSe i comandi eseguiti da crontab producono output, normalmente il demone cron
invia una mail al relativo utente contenente quell'output.
- Per rendere silente l'esecuzione di un particolare comando, è possibile redirigere il suo output a
/dev/null
. Per evitare di ricevere la mail da cron, aggiungere il testo seguente a tutti i comandi. Questo redirigerà lo standard output su/dev/null
e lo standard error sullo standard output, sopprimendo ogni messaggio di output (compresi quelli di errore):
>/dev/null 2>&1
- Se si utilizza Vixie cron, è possibile bloccare l'invio delle email di notifica per tutti i job di un utente, aggiungendo la seguente linea al rispettivo
crontab
:
MAILTO=""
Voci correlate
modificaat
: esegue un comando a una data ora specificatalaunchd
: il corrispondente di cron nei sistemi macOS/Apple Darwinanacron
Collegamenti esterni
modifica- Computer Hope Informazioni sul comando crontab in Unix e Linux
- Specifiche Opengroup - documentazione ufficiale UNIX 03
- Unix crontab - Quick Reference, su adminschoice.com.
- Cron per Windows, su kalab.com. URL consultato il 22 marzo 2006 (archiviato dall'url originale il 27 novembre 2006).
- fcron - una versione in (GPL)
- Pseudo-cron Un simil-cron in PHP
- WebBasedCron - Un servizio cron Web-based
- Webcron - Un servizio cron Web-based in italiano (e varie altre lingue)
- http://www.artcava.net/Utilities/WebSchedule/WebScheduleInfo.aspx[collegamento interrotto] - Un servizio cron Web-based in italiano
- crontab.guru - Un editor online per espressioni crontab
- crontab.tech -Un editor online intuitivo per l'espressione crontab