Spesso c’è la necessita’ di eseguire un comando, uno script o un programma ad intervalli regolari di tempo, un mese, un’ora, un giorno, una settimana o altri. Un meccanismo presente di default in Linux che e’ rappresentato dal demone cron.

Cron viene attivato ogni minuto e legge degli opportuni file di configurazione dove vengono specificate le operazioni da compiere e gli intervalli relativi. Se trova qualcosa da eseguire nel minuto in cui si e’ attivato, allora procede all’operazione. Tutto cio’ che viene scritto sullo standard output, viene inviato via email al proprietario del cron, tipicamente “root”.
Cron non deve essere riavviato per ogni modifica. Ci sono modi diversi di specificare operazioni ed intervalli.

-Configurazioni e modalità-

La via piu’ semplice e’ la creazione di uno script “sh, bash, perl, etc..”  che esegue cio’ che vogliamo. Tale script andra’ inserito in una delle directory seguenti

/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly

per poter essere eseguito ad intervalli definiti ( un giorno, un’ora, un mese e una settimana). E’ possibile anche mantenere tutti gli script in una directory standard (ad esempio “/avvio”) e poi creare un soft link “ln -s” in una di quelle sopra elencate.

Per intervalli di tempo diversi da quelli standard, e’ possibile usare la directory

/etc/cron.d

oppure il file

/etc/crontab

In cron.d possono essere inseriti file con formato particolare (lo stesso di crontab), indicanti operazioni ed intervalli di tempo piccoli anche solo minuto.

-FORMATO:

Possono essere inseriti in ogni file

Per quanto riguarda le variabili di ambiente, fra le possibili utilizzabili vi sono

Una tecnica comunemente usata per evitare l’invio della mail, o evitare la scrittura del risultato dell’operazione sulla mail che viene inviata, e’ la redirezione dell’output sul dispositivo “/dev/null”, esempio:

/prova/test.sh>/dev/null

I comandi cron rappresentano la parte piu’ complessa della configurazione.
Il formato di un comando cron e’ il seguente:

s1 s2 s3 s4 s5 Proprietario Comando

Analizzando:

Comando e’ un comando da eseguire (con i relativi parametri ed eventuali redirezioni di output).
Proprietario indica a chi appartiene il comando cron (es. root o altri utenti).
**

s1, s2, s3, s4, s5 sono stringhe che specificano l’intervallo di esecuzione. Ognuna di queste stringhe puo’ contenere il carattere “*” per indicare tutti i valori possibili.

s1 rappresenta i minuti. I valori permessi vanno da 0 a 59. E’ possibile specificare anche intervalli (piu’ avanti spiegati brevemente).
s2 rappresenta le ore. I valori permessi vanno da 0 a 23. E’ possibile specificare anche intervalli (piu’ avanti spiegati brevemente).
s3 rappresenta i giorni all’interno di un mese. I valori permessi vanno da 1 a 31. E’ possibile specificare anche intervalli (piu’ avanti spiegati brevemente).
s4 rappresenta i mesi. I valori permessi vanno da 1 a 12 (piu’ i nomi in lettere). E’ possibile specificare anche intervalli (piu’ avanti spiegati brevemente).
s5 rappresenta i giorni della settimana. I valori permessi vanno da 0 a 7 (piu’ i nomi in lettere, 0 e 7 rappresentano entrambi la Domenica). E’ possibile specificare anche intervalli (piu’ avanti spiegati brevemente).

NB: Tutte e cinque le stringhe possono rappresentare un numero, tutti i valori oppure un intervallo.
Specificando un numero, si indica un momento preciso. Ad esempio, mettere 2 in s4, significa eseguire a Febbraio (vanno considerate poi anche tutte le altre 4 stringhe).
Se il particolare campo non interessa, cioe’ non e’ utile alla definizione del tempo di attivazione, puo’ essere usato l’asterisco (“*”) per indicare tutti i valori.

Molto spesso, pero’ quello che serve e’ un certo intervallo e non un momento unico e preciso. Per esempio, potremmo volere eseguire un comando ogni 2 minuti invece che sempre e solo nel secondo minuto. In questo caso, possiamo scrivere le cinque stringhe (o solo una parte di esse) sotto forma di intervallo. Vediamone qualche formato (non tutti potrebbero essere supportati su tutti i sistemi):

Sono possibili anche altre combinazioni.
Qualche esempio:

# Esegue il comando indicato ogni cinque minuti, solo il 15 di ogni mese,
# con proprietario "root"
*/5 * 15 * * root /bin/ls /var/log/ls>/tmp/ls.output

# Manda una mail con il testo indicato ogni giorno alle 8:00 di mattina,
# con proprietario "root". Se MAILTO vale "root" allora la mail arriva a root.
0 8 * * * root echo "Salve!!!"

#Esegue ogni minuto!!! Il proprietario e' "test".
* * * * * test /usr/bin/mousepad

Un utente diverso da root, per usare dei propri comandi cron personalizzati, può agire direttamente sulla directory:

/var/spool/cron/crontabs/

Il file non dovrebbe essere editato direttamente e di solito non puo’ esserlo da parte di un utente diverso da root in quanto viene gestito dal comando /usr/bin/crontab.

L’idea e’ che venga mantenuto un file master con i cron di un utente.
Il file master puo’ risiedere ovunque nel filesystem.
Con l’installazione, crontab ne copia il contenuto all’interno del file “/var/spool/cron/crontabs/nomeutente”.
Sempre con crontab (“man crontab”) e’ possibile rimuovere i cron installati.
La politica per cui un utente puo’ usare il comando “crontab” e’ regolata dai file

/etc/cron.allow
/etc/cron.deny

Supponiamo di usare come test l’utente “utente1” con home directory “/home/utente1”. Creiamo il file “/home/utente1/test.cron” con il seguente contenuto:

# Test di utilizzo di crontab

MAILTO=utente1@localhost
* * * * * utente1 echo "ciao utente1"

Questo cron setta la mail per inviare l’output a utente1 e scrive il messaggio “ciao utente1” ogni minuto.

Per installare il contenuto del file indicato, eseguire nel caso si stia lavorando da utente root:

/usr/bin/crontab -u utente1 /home/utente1/test.cron

oppure, se si sta lavorando come utente “utente1”:

/usr/bin/crontab /home/utente1/test.cron

Si notera’ la comparsa del file “/var/spool/cron/crontabs/utente1” con il seguente contenuto (o simile):

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/home/user1/test.cron installed on *)
# (Cron version -- $Id: crontab.c etc....)
MAILTO=utente1@localhost
* * * * * utente1 echo "ciao utente1"

NB: L’installazione dei cron di un utente, sovrascrive i cron eventualmente gia’ presenti per l’utente stesso.

Per aggiungere comandi cron senza eliminare quelli precedenti, e senza inserirli prima nel master, usare se si sta lavorando come utente root:

/usr/bin/crontab -u utente1 -e

se si sta lavorando come utente “user1”:

/usr/bin/crontab -e

Si aprira’ l’editor “vi” con i comandi gia’ presenti e ci sara’ la possibilita’ di inserirne di nuovi oppure di modificare, oltre che eliminare, quelli esistenti. Tutto cio’ non tocca il file master ma solo il file “/var/spool/cron/crontabs/user1”, evitando la procedura di reinstallazione.
Tipicamente si edita il file master e lo si reinstalla, in modo da evitare di perdere le modifiche inserite con “-e”.
Per eliminare i cron inseriti, usare se si sta lavorando come utente root:

/usr/bin/crontab -u user1 -r

se si sta lavorando come utente “utente1”:

/usr/bin/crontab -r

#