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:
Per un intervallo può essere specificato anche un passo, ovvero l’incremento con il quale devono essere scanditi gli elementi dell’intervallo stesso. Per specificare il passo è sufficiente far seguire l’intervallo da /number, dove number è l’incremento del passo (es. se il campo hour è “0-7/2”, viene considerato valido per le ore 0, 2, 4 e 6);
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.