Pianificazione di comandi e task in Linux

In questo post vedremo come poter pianificare tramite schedulazione dei comandi in ambiente Linux. Ciò è utile quando ad esempio si vuole pianificare delle operazioni di backup in certi orari della giornata (tipicamente durante gli orari notturni) o in precisi giorni della settimana o del mese, oppure quando si vuole semplicemente programmare l’esecuzione di un lavoro.

Ultimamente mi è capitato di dover prevedere dei riavvi di un Server Web (almeno una volta a settimana) poichè le applicazioni Java che vi girano, all’interno di un Application Server quale IBM WebSphere, consumavano nell’arco temporale di una settimana appunto tutte le risorse disponibili (in particolare la memoria Heap) lanciando delle eccezioni del tipo OutOfMemoryError.

Nei Sistemi Operativi Linux ci viene in aiuto per compiere delle schedulazioni, il comando crontab il quale ci consente di registrare presso il S.O. dei comandi o dei task in modo da essere eseguiti in certi istanti temporali o ripetuti nel tempo, crontab memorizza le informazioni di schedulazioni in appositi file che sono specifici per il singolo utente di S.O. . Il tutto è realizzato grazie ad un demone denominato crond che è costantemente attivo in background ed analizza ogni minuto (il più piccolo intervallo disponibile per la schedulazione) i file scritti dal comando crontab che contengono gli istanti di schedulazione dei task.

I file di configurazione scritti da crontab sono dei file testuali in formato ASCII memorizzati nella directory /var/spool/cron/crontabs e prendono il nome dell’utente che li ha creati tramite il comando:

crontab -e
infatti tali file non andrebbero mai editati manualmente ma richiamati esclusivamente tramite il comando riportato, se è la prima volta che si richiama il comando allora verrà creato il file con il nome dell’utente che ha lanciato il comando. Se si vuole specificare un altro utente basta aggiungere il parametro -u seguito dal nome dell’utente voluto (opzionale).

La lista di parametri che possiamo utilizzare col comando crontab è riportata di seguito:

Sintassi Parametri
crontab -l [-u user] visualizza il contenuto del file crontab
crontab -e [-u user] crea o edita il file crontab
crontab -i user sostituisce il file crontab dell’utente con
quello dell’utente user passato come parametro

crontab -r [-u user] cancella il file crontab
Vediamo ora la sintassi per poter specificare un istante di schedulazione:

.--------------[m]inute: minuto (0-59) 
| .------------[h]our: ora (0-23)
| | .----------[d]ay [o]f [m]onth: giorno del mese (1-31)
| | | .--------[mon]th: mese (1-12) OPPURE jan,feb,... 
| | | | .------[d]ay [o]f [w]eek: giorno della settimana  
| | | | |      (0-6) (domenica=0 o 7) OPPURE 
| | | | |      sun,mon,tue,wed,thu,fri,sat 
* * * * *  comando da eseguire

comando da eseguire bisogna dunque specificare 5 campi intervallati da uno spazio, in realtà ne possono anche essere 6, nell’ultimo si specifica l’anno. I primi tre campi possono essere esclusivamente dei numeri il quarto e quinto possono essere in forma testuale composta da tre caratteri. Possono inoltre essere specificati dei caratteri speciali come riporta la seguente tabella:

Nome Campo Obbligatorio Valori Consentiti Caratteri Speciali Consentiti

Minutes

Yes 0-59 * / , –
Hours Yes 0-23 * / , –
Day of month Yes 1-31 * / , – ? L W
Month Yes JAN-DEC * / , –
Day of week Yes SUN-SAT * / , – ? L #
Year No 1970–2099 * / , –

Ed hanno il seguente significato:

  • l’asterisco ( * ) specifica tutti i possibili valori di un campo. Ad esempio, un asterisco nel campo dell’ora è equivalente a «ogni ora»;
  • la virgola ( , ) specifica una lista di valori, ad esempio: «1,3,4,7,8»;
  • il trattino ( ) specifica un intervallo di valori, ad esempio: «1-6», che equivale a «1,2,3,4,5,6»;
  • la sbarra ( / ) indica degli incrementi di range nell’intervallo specificato, ad esempio 3-57/15 inserito nel campo dei minuti indica il 3° minuto ed ogni 15 minuti compresi nell’intervallo 3-57, quindi 18, 33 e 57;
  • il punto interrogativo ( ? ) indica un campo non definito, utile per omettere la specifica di un campo, non sempre è supportato (è ammesso ad esempio sulle distribuzioni Ubuntu);
  • il carattere ( L ) abbreviativo di Last, specifica l’ultimo giorno del mese se indicato nel campo Day of Month oppure l’ultimo dei giorni di un mese (ad esempio l’ultimo venerdì) se indicato nel campo Day of Week;
  • il carattere ( W ) abbreviativo di WeekDay, specifica il più vicino WeekDay (l’intervallo dal Lunedì al Venerdì) al giorno del mese specificato, ad esempio 15W indica di effettuare il task nel WeekDay più vicino al 15;
  • il cancelletto ( # ) seguito da un numero compreso tra 1 e 5, specifica in quale settimana lanciare il trigger, ad esempio 5#2 indica il secondo venerdì del mese.

Facciamo ora alcuni esempi di utilizzo dei campi:

0 12 * * * : tutti i giorni a mezzogiorno (12:00 a.m.);
0 12 15 * * : tutti i 15 del mese, alla stessa ora;
0 12 * * 0 : ogni domenica, a mezzogiorno;
*/5 9-17 * * mon,tue,wed,thu,fri : ogni 5 minuti, dalle 9 alle 17 da lunedì a venerdì;
0 12 31 * * : 7 volte l’anno, alla stessa ora (solo i mesi con 31 giorni).
Il seguente comando posto nel crontab esegue il backup della directory Documenti contenuta nella home dell’utente user ogni giorno alle ore 20:00:

00 20 * * * tar -zcf /home/backup/doc.tar.gz /home/user/Documenti

Una volta eseguiti i comandi elencati nel file crontab, il demone cron invia una mail al relativo utente.

Per rendere silente l’esecuzione di un particolare comando oppure nel caso in cui non sia stato configurato un server SMTP, in Ubuntu ad esempio è necessario configurare un MTA (Mail Transfer Agents), è possibile redirigere il suo output a /dev/null. Per evitare di ricevere la mail da cron, bisogna aggiungere il testo seguente alla fine di tutti i comandi:

>/dev/null 2>&1

Questo redirigerà lo standard output su /dev/null e lo standard error sullo standard output, sopprimendo ogni messaggio di output (compresi quelli di errore):

Ad esempio il comando visto in precedenza diventa:

00 20 * * * tar -zcf /home/backup/doc.tar.gz /home/user/Documenti > /dev/null 2>&1

Per visualizzare il log di esecuzione del demone cron possiamo utilizzare il seguente comando:

sudo grep CRON /var/log/syslog

il nome cron va scritto in maiuscolo.

1 Stella2 Stelle3 Stelle4 Stelle5 Stelle (2 voti, media: 5,00 di 5)
Loading...
You can leave a response, or trackback from your own site.

Leave a Reply

*