9.2.1 cron

Il daemon crond (man page cron(8)) viene generalmente lanciato da /etc/rc durante la procedura di avvio del sistema. Esso ha il controllo dell’eventuale schedulazione dei job presente sul sistema e si basa sul contenuto del file di sistema /etc/crontab e dei file contenuti nella directory /var/spool/cron.

Per ogni utente del sistema è associato un file /var/spool/cron/username atto a contenere le impostazioni relative ai job che l’utente in questione desidera schedulare. In genere ci si riferisce a tale file chiamandolo impropriamente file crontab dell’utente username. Qualunque job schedulato all’interno del file crontab di un utente viene lanciato dal sistema con i privilegi dell’utente possessore del file crontab stesso.

Il comando crontab (man page crontab(1)) è utilizzato per creare e modificare i file crontab (man page crontab(5)) per la schedulazione dei job. La sintassi è la seguente:

 
$ crontab [opzioni]  
dove

Se username non viene specificato, viene considerato l’utente corrente (quello che ha digitato il comando).

Il file /var/spool/cron/username è formato da righe di testo con la seguente sintassi:

 
minute hour day_of_month month day_of_week command  
dove

I comandi (job) sono eseguiti da cron quando il software clock raggiunge il minuto minute, l’ora hour, il mese month ed almeno uno dei campi day_of_month e day_of_week coincide con il giorno del mese o della settimana attuale.

Ogni campo che specifica la data/ora di avvio del comando command, può essere costituito da un singolo valore numerico o:

Esiste anche la possibilità di specificare, all’interno dei file crontab, assegnamenti di variabili di ambiente. Ciò può essere fatto inserendo delle righe con la seguente sintassi:

 
name = value  
dove name è il nome della variabile di ambiente da impostare e value è il valore con cui impostarla.

Il file /etc/crontab è formato da righe di testo con sintassi leggermente diversa da quella dei file crontab degli utenti, infatti ogni riga è composta da:

 
minute hour day_of_month month day_of_week username command  
in quanto essendo un file di schedulazione generale, è necessario specificare quale sia l’utente (username) che virtualmente lancia il comando command.

Il processo cron controlla ogni minuto i files sopra indicati e lancia i job in essi specificati con la pianificazione impostata. L’output del job viene inviato via posta elettronica all’utente associato al file crontab.

 
# Esegue 5 minuti dopo la mezzanotte di ogni giorno.
5 0 * * * $HOME/bin/prova

# Esegue alle ore 14:15 del primo giorno di ogni mese.
# L'output viene inviato tramite posta elettronica all'utente tizio.
15 14 1 * * $HOME/bin/mensile

# Esegue alle 22 di ogni giorno lavorativo (da lunedì al venerdì).
# In particolare viene inviato un messaggio di posta elettronica a caio.
0 22 * * 1-5 mail -s Sono le 22 caio%Caio,%%è ora di andare a letto!%

# Esegue 23 minuti dopo mezzanotte, dopo le due, dopo le quattro,...,
# ogni giorno.
23 0-23/2 * * * echo Ciao

# Esegue alle ore 04:05 di ogni domenica.
5 4 * * 0 echo Sono le 04:05 di Domenica  
Un esempio del file /etc/crontab è riportato di seguito (il contenuto di tale file è comune a molte distribuzioni GNU/Linux):

 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
02 4 * * 0 root run-parts /etc/cron.weekly
02 4 1 * * root run-parts /etc/cron.monthly
 
Il comando run-parts (che in genere è uno script collocato nella directory /usr/bin/) viene impostato ad essere eseguito a cadenza oraria, giornaliera, settimanale e mensile. Tale comando avvia tutti i files eseguibili contenuti nella directory indicata come argomento. Pertanto run-parts /etc/cron.hourly avvia tutti i files esequibili contenuti nella directory /etc/cron.hourly.

Alcune distribuzioni GNU/Linux hanno introdotto una variante di crond di Paul Vixie, estendendo il crontab di sistema ai file contenuti nella directory /etc/cron.d. Questi file hanno la stessa sintassi di /etc/crontab e vengono scanditi assieme a quello principale. In questo modo i vari pacchetti che hanno la necessità di schedulare dei propri job sono svincolati dal dover gestire un unico file (/etc/crontab) ma ogni pacchetto ha il proprio file nella directory /etc/cron.d che può gestire come crede.