Crontab
# 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

I 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

Esistono 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 a 1,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

I primi cinque campi su ogni riga specificano con che frequenza e quando eseguire un comando.

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

**Errori ricorrenti**

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:

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.

In questo esempio il carattere % denota l'inizio del STDIN per il comando cat:

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**

Molti 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:

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.

### Disabilitare l'Email di notifica

Se 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):
* 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:
