Capitolo 37. Compiti automatizzati

Su Linux, è possibile configurare il sistema affinchè alcune operazioni vengano eseguite in modo automatico entro un determinato periodo di tempo o in giorni stabiliti, o quando il carico medio del sistema è al di sotto di un numero specificato. Red Hat Enterprise Linux è già preconfigurato per l'esecuzione di alcuni compiti di aggiornamento del sistema. Per esempio, il database slocate, usato dal comando locate, viene aggiornato quotidianamente. Un amministratore di sistema può utilizzare dei compiti automatizzati per eseguire backup periodici, controllare il sistema, eseguire script personalizzati e altro.

Red Hat Enterprise Linux viene fornito con diverse utility per compiti automatizzati: cron, anacron, at e batch.

37.1. Cron

Cron è un demone che può essere utilizzato per eseguire operazioni pianificate in base all'ora, al giorno del mese, al mese, al giorno della settimana e alla settimana.

Cron presuppone che il sistema sia sempre acceso. In caso contrario, quando viene pianificata una operazione, questa non viene eseguita. Per pianificare operazioni da eseguire una sola volta, consultate la Sezione 37.2.

Per usufruire del servizio di cron, è necessario installare il pacchetto RPM vixie-cron e il servizio crond deve essere in esecuzione. Per stabilire se il pacchetto è già installato, usare il comando rpm -q vixie-cron. Per determinare se il servizio è in esecuzione, digitate il comando /sbin/service crond status.

37.1.1. Come configurare le operazioni con Cron

Il file di configurazione più importante di cron, /etc/crontab, contiene le righe seguenti:

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

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Le prime quattro righe sono variabili utilizzate per configurare l'ambiente in cui vengono eseguite le operazioni di cron. Il valore della variabile SHELL indica al sistema quale ambiente shell utilizzare (in questo esempio, bash shell) e la variabile PATH definisce il percorso utilizzato per eseguire i comandi. L'output delle operazioni cron viene inviato tramite e-mail al nome utente definito con la variabile MAILTO Se la variabile MAILTO viene specificata come sstringa vuota (MAILTO=""), non verrà inviata alcuna email. La variabile HOME può essere utilizzata per impostare la directory home per l'esecuzione di comandi o script.

Ogni riga nel file /etc/crontab rappresenta un'operazione e ha il formato seguente:

minute   hour   day   month   dayofweek   command

  • minute — qualsiasi numero intero da 0 a 59;

  • hour — qualsiasi numero intero da 0 a 23;

  • day — qualsiasi numero intero da 1 a 31 (deve essere un giorno valido per il mese specificato);

  • month — qualsiasi numero intero da 1 a 12 (o abbreviazione del nome del mese, come gen, feb e così via);

  • dayofweek — qualsiasi numero intero da 0 a 7 in cui 0 o 7 rappresenta la domenica (oppure l'abbreviazione del giorno come dom, lun e così via);

  • command — è il comando da eseguire (può essere un comando come ls /proc >> /tmp/proc oppure un comando scritto da voi per eseguire uno script).

Per qualsiasi valore tra quelli sopra descritti, può essere utilizzato un asterisco (*) che rappresenta tutti i valori validi. Per esempio, un asterisco per il valore del mese indica di eseguire il comando ogni mese in base alle restrizioni degli altri valori.

Un trattino (-) tra numeri interi specifica un intervallo di numeri interi. Per esempio 1-4 indica un intervallo che comprende i numeri interi 1, 2, 3 e 4.

Una serie di valori separati da virgole (,) determina un elenco. Per esempio 3, 4, 6, 8 indica questi quattro numeri interi.

La barra (/) può essere usata per specificare valori che devono essere ignorati. Per omettere un numero entro un intervallo è necessario aggiungerlo alla fine dell'intervallo in questo modo: /<numero>. Per esempio 0-59/2 può essere usato per definire ogni minuto nel campo dei minuti. I valori da omettere possono essere usati anche con un asterisco. Per esempio, il valore */3 può essere usato nel campo dei mesi per eseguire l'operazione ogni tre mesi.

Le righe che iniziano con un carattere cancelletto (#) sono considerate commenti e, pertanto, non vengono elaborate.

Come potete notare nel file /etc/crontab, esso utilizza lo script run-parts per eseguire gli script nelle directory /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly e /etc/cron.monthly, rispettivamente su base oraria, giornaliera, settimanale o mensile. I file in queste directory dovrebbero essere script della shell.

Se un'operazione di cron deve essere eseguita con una programmazione diversa da quella oraria, giornaliera, settimanale o mensile, potete aggiungerla nella directory /etc/cron.d. Tutti i file in questa directory utilizzano la stessa sintassi di /etc/crontab. Per ulteriori esempi, consultate Esempio 37-1.

# record the memory usage of the system every monday 
# at 3:30AM in the file /tmp/meminfo
30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
# run custom script the first day of every month at 4:10AM
10 4 1 * * /root/scripts/backup.sh

Esempio 37-1. Esempi di crontab

Gli utenti diversi da root possono configurare le operazioni di cron usando l'utility crontab. Tutti i crontab definiti dall'utente vengono salvati nella directory /var/spool/cron ed eseguiti usando il nome utente di chi li ha creati. Per creare un crontab con un determinato utente, connettetevi al sistema con il nome di questo utente e digitate il comando crontab -e per modificare il crontab utilizzando l'editor specificato nella variabile d'ambiente VISUAL o EDITOR. Il file utilizza lo stesso formato di /etc/crontab. Una volta salvate le modifiche al crontab, questo viene salvato in base al nome dell'utente e scritto nel file /var/spool/cron/nomeutente.

Il demone cron controlla il file etc/crontab, la directory /etc/cron.d/ e la directory /var/spool/cron ogni minuto per rilevare eventuali modifiche. Se vengono rilevate delle modifiche, il file e le directory vengono ricaricati in memoria. Tuttavia, se un file crontab viene modificato, non è necessario riavviare il demone cron.

37.1.2. Controllo dell'accesso al Cron

I file /etc/cron.allow e /etc/cron.deny consentono di limitare l'accesso a cron. Il formato di entrambi i file è costituito da un nome utente su ciascuna riga. Non possono essere lasciati spazi vuoti. Il demone cron (crond) non deve essere riavviato se i file di controllo dell'accesso vengono modificati. Questi file sono letti ogni volta che un utente cerca di aggiungere o eliminare un'operazione cron.

L'utente root può sempre usare cron, indipendentemente dai nomi degli utenti elencati nei file di controllo dell'accesso.

Se il file cron.allow esiste, solo gli utenti qui elencati possono usare cron e il file cron.deny viene ignorato.

Se cron.allow non esiste, gli utenti elencati in cron.deny non sono autorizzati a usare cron.

37.1.3. Avvio e interruzione del servizio

Per avviare il servizio cron utilizzate il comando /sbin/service crond start, per interromperlo, utilizzate invece il comando /sbin/service crond stop. Si raccomanda di eseguire il servizio al momento dell'avvio. Per maggiori dettagli sull'esecuzione automatica del servizio cron all'avvio, consultate il Capitolo 21.