Pianificazione di comandi e task in Linux

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.

Come riconoscere la distribuzione Linux che si sta utilizzando

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 cron 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, le azioni dell’utility cron vengono memorizzate in un file di nome crontab. In realtà il file crontab non è unico ma sono specifici per il singolo utente di S.O. (memorizzano le informazioni di schedulazioni per ogni singolo utente) . 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 cron 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 CampoObbligatorioValori ConsentitiCaratteri Speciali Consentiti

Minutes

Yes0-59* / , –
HoursYes0-23* / , –
Day of monthYes1-31* / , – ? L W
MonthYesJAN-DEC* / , –
Day of weekYesSUN-SAT* / , – ? L #
YearNo1970–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.

COMMENTS

WORDPRESS: 0