5.4. Metodi di elaborazione programmata dei compiti di sistema

I computer fanno bene una cosa, eseguono allegramente compiti molto ripetitivi che non si potrebbero completare da soli in un ammontare di tempo ragionevole (senza considerare quanto sarebbe noiosa l'esperienza nel frattempo). Da questa prospettiva, è ovvio che ogni sistema operativo serio dovrebbe avere un modo per svolgere i compiti in modo programmato per eseguirli più tardi, in futuro o in un modo ripetitivo (periodico).

Il lavoro "pionieristico" nella schedulazione automatizzata venne fatto dal capo di una fattoria gestita con IBM (con colture, animali e tutto il resto), negli anni '70. Egli ridusse tre turni di lavoro di 8 ore in due turni di 8 ore, sostituendo la terza persona (che non aveva praticamente da fare niente oltre ad avviare un comando di sistema alle 3 di notte), con un blocco del Lego mosso da un timer che cadeva da una certa altezza sul tasto Invio.

I sistemi Unix oggi hanno due schedulatori disponibili, at e cron. E tutti coloro che cercano un sistema Unix non banale di elaborazione sequenziale dovrebbero dare uno sguardo a Generic NQS.

5.4.1. At

Come si può dedurre dal nome del comando, at è progettato per avviare ciascun compito una sola volta all'orario specificato. La specificazione dell'orario è molto elaborata e supporta tutti i tipi di definizioni, come adesso, 12:00 o 12:00 domani. Può anche combinare costrutti come, 10:00 pm + 3 giorni; per una spiegazione completa si veda /usr/share/doc/at/timespec.

Per esempio si può provare echo "echo Hello, World" | at now + 1 minute. In un minuto si dovrebbe vedere "Hello, World" nella propria casella di posta. Nell'esempio il comando è stato fornito "sul posto", ma questo è Unix così si può anche salvare l'insieme di comandi da eseguire in un file (ad esempio cmds.at) e poi avviare at -f cmds.at now + 1 minute.

Si possono vedere i compiti da eseguire avviando atq ed eventualmente rimuoverli usando atrm. Il pacchetto at fornito con Debian supporta anche semplici esecuzioni sequenziali utilizzando batch. Per tutte le informazioni si veda la pagina di manuale appropriata.

5.4.2. Cron

Cron, o lo schedulatore Unix, esegue periodicamente compiti di sistema o dell'utente. Come si può supporre, cron gioca un ruolo significativo su ogni sistema Unix ed è, pertanto, anche parte di Debian GNU.

In sostanza, il file di configurazione di cron consiste di ciascun compito definito sulla propria riga. A sua volta, ciascuna riga consiste di una specificazione dell'orario in 5 campi e del compito da eseguire. I primi cinque campi indicano minuti, ore, giorni del mese, mesi e giorni della settimana. Ecco qui un paio di esempi per chiarire quanto detto:

# Avvia ogni minuto
* * * * *  /usr/local/bin/syscommand

# Avvia ogni 15 minuti
0,15,30,45 * * * *  /usr/local/bin/syscommand

# Avvia ogni 15 minuti, specificazione avanzata
*/15 * * * *  /usr/local/bin/syscommand

# Avvia ogni 2 ore
* */2 * * *  /usr/local/bin/syscommand

# Avvia una volta ogni ora nel periodo tra le 8:00 am e le 3:00 pm
0 8-15 * * *  /usr/local/bin/syscommand

Il file di configurazione di cron è uno tra i più interessanti in Unix. Si sia certi di leggere man 5 crontab.

5.4.2.1. crontab di sistema

Come al solito Debian GNU contiene crontab nel sistema base. Ci sono una grande quantità di cose da fare sul sistema, anche quando non si è installato niente altro che il setup minimo.

Il file di sistema di crontab in Debian GNU è /etc/crontab (chi lo avrebbe detto?). Si può vedere che, tra la specificazione di tempo e il comando da eseguire, questo file specifico accetta il nome utente Unix con il quale avviare il compito. (Benché questo di per sé sia conveniente e facile da vedere, si può anche naturalmente specificare un nome utente differente nella specificazione del comando.) Inoltre, si vede che Debian GNU ha predisposto le directory /etc/cron.*/ dove sia voi che gli script postinstallazione dei pacchetti potete posizionare compiti da eseguire. Per esempio, se lo si vuole eseguire una volta sola al giorno, semplicemente si metta uno script in /etc/cron.daily/. Se, d'altra parte, si vuole controllare esattamente il momento di esecuzione, mettere un file in /etc/cron.d/, dove ci si aspetta che siano i file di configurazione di crontab (o se proprio si deve, modificare direttamente /etc/crontab).

5.4.2.2. crontab dell'utente

Anche gli uenti di sistema possono avere i propri crontab. Tutto quello che si deve fare come utente di sistema, è di avviare crontab -e, digitare la propria specificazione e uscire dall'editor. Il crontab sarà installato automaticamente. Si può rivedere il proprio crontab dando crontab -l e rimuovere i compiti cron con crontab -r. Vedere man 1 crontab per maggiori informazioni.

Oltre ad avviare crontab -e, è anche possibile scrivere a mano le specificazioni in un file arbitrario e poi invocare crontab FILE.

Gli amministratori possono permettere o negare agli utenti di sistema l'utilizzo di cron; si cerchi cron.allow e cron.deny nella pagina di manuale di crontab.