IoPenSource: Demone-Cron-e-uso-di-Crontab ...

Home Page | Menu | News | Page Index | Ultime Modifiche | Ultimi Commenti | Utenti | Registrazione | Connessione:  Password:  

NOTA BENE1: il seguente articolo è stato adattato da un formato esterno a quello wiki: è possibile visualizzare il sorgente in formato HTML.
NOTA BENE2: questo articolo è stato fornito dal rispettivo autore in ILQOSL, ma il mantainer tecnico è il ServizioSegnaPosto, prego contattare quest'ultimo per il cambio di gestione e rimuovere poi questo avviso.



Il Demone “cron” e l’uso di “crontab”


Prima o poi un amministratore di sistema avrà la necessità di eseguire delle operazioni ad intervalli regolari; ad esempio una di queste motivazioni potrebbe essere quella di effettuare dei backup, o semplicemente programmare l'esecuzione di un lavoro, in date e orari prestabiliti. Nei sistemi operativi Unix e Unix-like queste operazioni vengono effettuate grazie ai crontab.


Per fissare o meglio pianificare(schedulare) gli eventi su una macchina linux è innanzitutto necessario avere a disposizione il demone che si occupa appunto dello scheduling. Questo demone chiamato cron è avviato in automatico allo startup del sistema.


Per editare i file di configurazione dei crontab, (/var/spool/cron/crontab/nomeutente) il modo migliore è quello di usare il comando:

crontab -e


in questo modo si richiamerà l’editor di sistema che, nella maggior parte dei casi è vi

Per iniziare a scrivere dobbiamo premere il tasto i (modalità inserimento), per salvare ed uscire premiamo il tasto ESC e digitiamo :wq (si notino i due punti)”


Il comando crontab può essere lanciato anche con altre opzioni oltre a quelle di editing. Tramite il parametro crontab -l è possibile per esempio, avere la lista dei crontab attualmente attivi.

Da notare che ogni utente può avere i propri crontab personali. Quando lanciamo il comando crontab –e editiamo i crontab dell’utente corrente, ma se volessimo modificare i crontab di un altro utente, ovviamente da root, potremmo lanciare il comando crontab –e nomeutente.

Attenzione all’opzione crontab –d cancella tutti i crontab impostati anche quelli di sistema.”



Sintassi

Descrizione

crontab [-u utente] file

Sostituisce il file crontab con il contenuto del file indicato come argomento.

crontab -l [utente]

Visualizza il file crontab dell'utente.

crontab -e [utente]

Crea o modifica il file crontab dell'utente.

crontab -r [utente]

Cancella il file crontab dell'utente



La sintassi di questo file una volta compresa , risulta molto veloce da utilizzare;


* * * * * commando da eseguire

- - - - -

| | | | |

| | | | ----- giorno della settimana (0 - 6) (domenica=0)

| | | ------- mese (1 - 12)

| | --------- giorno del mese (1 - 31)

| ----------- ora (0 - 23)

------------- minuti (0 - 59)



Il primo campo indica il minuto, il secondo l’ora, il terzo il giorno, il quarto il mese, il quinto il giorno della settimana e l’ultimo il comando da lanciare.


Per ognuno di questi campi, i valori possono essere indicati in vari modi ed assumere di conseguenza, diversi significati.

I Valori singoli

Un numero isolato all’interno di un campo indica che il comando deve essere eseguito quando l’orologio del sistema raggiunge quel valore. Per esempio, 20 8 * * * rappresenta esattamente le ore 08:20 di ogni giorno.

Gli Intervalli

Un intervallo, rappresentato da una coppia di numeri separati da un trattino, indica che il comando deve essere eseguito ogni volta che l’orologio del sistema raggiunge uno di quei valori possibili. Per esempio, 20 8 1-5 * * rappresenta esattamente le ore 08:20 dei primi cinque giorni di ogni mese.

Gli Elenchi

Un elenco, rappresentato da una serie di numeri separati da una virgola senza spazi, indica che il comando deve essere eseguito ogni volta che l’orologio del sistema raggiunge uno di quei valori. Per esempio, 20 8 1-7 2,4,6 * rappresenta esattamente le ore 08:20 dei primi sette giorni di febbraio, aprile e giugno.

Gli elenchi possono essere anche combinati con gli intervalli. Per esempio, 20 8 1-7 2-4,6-9 * rappresenta esattamente le ore 08:20 dei primi sette giorni di febbraio, marzo, aprile, giugno, luglio, agosto e settembre.

Il Passo

E' anche possibile indicare una ripetizione o un passo con slash seguito da un determinato valore, in questo modo il comando viene eseguito ogni volta che è trascorso quel lasso di tempo. Per esempio, */10 8 * * * rappresenta le ore 08:00, 08:10, 08:20, 08:30, 08:40 e 08:50. In pratica, corrisponde a 0,10,20,30,40,50 8 * * *.

Il passo può essere combinato opportunamente con gli intervalli. Per esempio, 0-30/10 8 * * * rappresenta le 08:00, le 08:10, le 08:20 e le 08:30. In pratica, corrisponde a 0,10,20,30 8 * * *.


Alcuni Esempi:

10-40/10 19 * * * ls /home/prova

Nell’esempio il comando ls verrebbe lanciato tutti i giorni alle 19,10, alle 19,20, alle 19,30 e alle 19,40


Un altro esempio potrebbe essere:

0 5 * * 2 ls /home/prova

In questo caso ogni martedì(2), di ogni mese, alle 5, verrebbe lanciato il nostro ls

Da notare che i giorni sono così definiti:

0 per la domenica 1 per il lunedì 2 per il martedì e così via…


E se avessimo voluto far eseguire il comando ogni martedì ma solo nel mese di marzo?

0 5 * 3 2 ls /home/prova


Come si può facilmente dedurre, al posto del comando ls, potrebbe esserci uno script che in un determinato momento esegua il tar di una directory o qualsiasi altra cosa vogliate!


Configurazione di base:

le righe seguenti, mostrano il file di crontab installato per default sulla mia Slackware:


# Run hourly cron jobs at 47 minutes after the hour:

47 * * * * /usr/bin/run-parts /etc/cron.hourly 1> /dev/null

#

# Run daily cron jobs at 4:40 every day:

39 13 * * * /usr/bin/run-parts /etc/cron.daily 1> /dev/null

#

# Run weekly cron jobs at 4:30 on the first day of the week:

30 4 * * 0 /usr/bin/run-parts /etc/cron.weekly 1> /dev/null

#

# Run monthly cron jobs at 4:20 on the first day of the month:

20 4 1 * * /usr/bin/run-parts /etc/cron.monthly 1> /dev/null


Come potete notare, lo script run-parts viene utilizzato per eseguire gli script eventualmente presenti nelle directory /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly, rispettivamente su base oraria, giornaliera, settimanale o mensile. Nella propria distribuzione GNU/Linux, il nome utilizzato per questo programma potrebbe essere diverso, e così anche i nomi delle directory, ma quello che conta è comprendere che, per inserire un'elaborazione nei momenti più comuni, basta mettere lo script relativo, nella directory che rappresenta la cadenza desiderata.


Disabilitare l’email di notifica


Normalmente, l’output dei comandi eseguiti da crontab, viene per default inviato, dal demone cron, al relativo utete tramite mail.

Per rendere tacita l'esecuzione di un particolare comando, è possibile redirigere il suo output in /dev/null.




50 15 * * 1-5 comando da eseguire > /dev/null 2>&1



In questo modo, si redirigerà lo standard output su null e lo standard error sullo standard output, sopprimendo ogni messaggio di output (compresi quelli di errore).


Schedulare un Backup

Immaginiamo ora di voler effettuare, periodicamente, il backup della directory /lavoro su /backup_lavoro; potremmo utilizzare il comando:


rsync -a -v --delete /lavoro /backup_lavoro

Rsync è un software, in grado di sincronizzare file e cartelle da una locazione all'altra; il mirroring avviene attraverso una sola trasmissione di dati per ogni direzione di comunicazione e, l'aggiornamento dei dati in funzione delle opzioni utilizzate, può basarsi sul confronto delle date di modifica, delle dimensioni dei file e anche sul calcolo di un codice di controllo (checksum).”



-a duplica anche le sottodirectoy in modo ricorsivo

-v ci da il dettaglio dello svolgimento della copia

--delete cancella i file sotto /backup_lavoro che non esistono in /lavoro



Bene, ora che abbiamo capito in linea di massima come funziona rsync(vi rimando alla consultazione del man per un quadro completo), possiamo inserire nei crontab la seguente riga:




0 13 * * * rsync -a -v --delete /lavoro /backup_lavoro



in questo modo ogni giorno alle 13, rsync eseguirà il nostro backup.



Per sapere se il backup è stato eseguito, potremmo inviarci l'output di rsync sulla nostra mail con l'uso del pipe e l'opzione -s nel seguente modo:




0 13 * * * rsync -a -v --delete /lavoro /backup_lavoro | mail –s tuamail@dominio.it “Log Backup”



Conclusioni:


In questo articolo, abbiamo visto la possibilità di pianificare e automatizzare dei jobs, che poi il sistema eseguirà senza bisogno della nostra presenza fisica. Spero di essere stato chiaro e, di avervi indicato a chi rivolgervi, quando dovrete schedulare qualche operazione che non sia da eseguire all'avvio del sistema.




Gianbattista Magni

contact

note sull'autore:


Formato da studi tecnici dal 1999 ad oggi, lavora come Amministratore di sistemi Unix Solaris e Linux, presso una società del settore IT. Si occupa, nei ritagli di tempo, della creazione e sviluppo di siti internet ad alta accessibilità.


distribuzione preferita:


Slackware, da sempre!!




 
Non c'è alcun file in questa pagina. [Visualizza/invia file]
Ci sono 2 commenti su questa pagina. [Mostra commenti/forma]