Unnikked - Esperienze personali in campo informatico

Esegui operazioni automaticamente tramite crontab

Una attività molto comune per chi deve gestire un server è quello di pianificare backup periodici dei propri files, ottimizzare le tabelle di un database o altro. Per evitare di eseguire manualmente questi compiti sui sistemi operativi Linux esiste un demone chiamato crontab che ci consente di pianificare, ed eseguire dunque, periodicamente operazioni in base a regole specifiche.

Assicuriamoci che il demone sia installato sulla distribuzione Linux (nelle distribuzioni più famose è già presente).

L’esecuzione di questo programma si basa su delle regole ben precise che vanno inserite in un file di configurazione. (Vedremo in seguito come modificarlo) La sintassi generica da seguire è la seguente.

Minuto Ora Giorno del mese Mese Giorno della settimana Comando
(0-59) (0-23) (1-31) (1-12 o Jan-Dec) (0-6 o Sun-Sat)
2 12 * 0,6 /usr/bin/find

Dove i giorni della settimana vanno da domenica a sabato.

Per modificare il file di configurazione possiamo lanciare il comando :

crontab -e

Se è la prima volta che si accede a crontab il sistema mostrerà a video una serie di opzioni riferiti all’editor di default da utilizzare :

no crontab for unnikked - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny

Choose 1-4 [2]:

Una volta aperto l’editor di testo è possibile inserire le varie regole, ecco alcuni esempi:

* * * * * /sbin/ping -c 1 192.168.0.1 > /dev/null

Questa espressione esegue il comando /sbin/ping -c 1 192.168.0.1 redirezionandolo su /dev/null ad ogni minuto, ogni ora, ogni giorno, ogni mese ed ad ogni giorno della settimana.

0 0,12 1 * * /sbin/ping -c 192.168.0.1; ls -la >>/var/log/cronrun

Questa espressione esegue i comandi specificati alle 24 e alle 12 di ogni primo giorno di ogni mese.

E’ possibile anche specificare alcune parole chiavi per alcune tipologie di espressioni come:

Chiave Descrizione Equivalente a
@yearly (o @annually) Si esegue una volta all’anno a mezzanotte al mattino del 1 Gennaio 0 0 1 1 *
@monthly Si esegue una volta a mese a mezzanotte al mattino del primo del mese 0 0 1 * *
@weekly Si esegue una volta a settimana alla mezzanotte di Domenica 0 0 * * 0
@daily Si esegue una volta a giorno alla mezzanotte 0 0 * * *
@hourly Si esegue una volta all’inizio di ogni ora 0 * * * *
@reboot Si esegue all’avvio @reboot</p> <p>

E’ possibile anche utilizzare caratteri speciali nella definizione di un espressione, tuttavia essi dipendono dalla distribuzione e versione specifica di cron:

  • Asterisco (*): L’asterisco indica che l’espressione corrisconde a tutti i valori del campo. Es: usando un asterisco nel campo mese indica ogni mese.

  • Slash ( / ): Lo slash descrive gli incrementi di intervalli. Per esempio 3-59/15 nel campo minuto indica il terzo minuto dell’ora e ogni 15 minuti da allora in poi. La forma */... è equivalente alla forma primo-ultimo/..., cioè un incremento sul più grande possibile intervallo del campo.

  • Percento ( % ): I segni percento (%) nel comando, salvo che non viene valutato come carattere di escape tramite il simbolo (), sono cambiati in caratteri di nuova linea, e tutti i dati dopo il primo % sono inviati al comando come standard input.

  • Virgola ( , ): La virgola è usata per separare gli elementi di una lista. Per esempio, l’uso di MON,WED,FRI nel campo giorno della settimana significa lunedi, mercoledi e giovedi.

  • Trattino ( – ): Per esempio, 2013-2020 indica ogni anno tra l’anno 2013 e l’anno 2020, incluso.

  • L: ‘L’ sta per “ultimo”. Quando è usato nel campo giorno della settimana, permette di specificare costrutti come “l’ultimo venerdi” (”5L”) del mese specificato. Nel campo giorno del mese indicica l’ultimo giorno del mese. Nota: L è un carattere non stardard ed esiste solo in alcune implementazioni di cron (Quartz java scheduler).

  • W: Il carattere ‘W’ viene utilizzato nel campo giorno del mese. Questo carattere è usato per specificare i giorni della settimana (lunedi-venerdi) vicini al giorno specificato. Come esempio, se si specifica ”15W” come valore del campo giorno del mese. il significato è: “i più vicini giorni della settimana vicini al giorno 15 del mese.” Così, se il giorno 15 è sabato, il cron viene eseguito venerdi 14. Se il 15 è domenica, il cron viene eseguito lunedi 16. Se il 15 è martedi, il cron viene eseguito martedi 15. Comunque se si specifica ”1W” come valore e il primo giorno del mese è sabato, il cron viene eseguito lunedi 3 dal momento che non salta oltre i giorni del mese. Il carattere ‘W’ può essere specificato solo quando il giorno del mese è un singolo giorno, non un intervallo o una lista di giorni.Nota: W è un carattere non stardard ed esiste solo in alcune implementazioni di cron (Quartz java scheduler).

  • Hash ( # ): ’#’ è permesso nel campo giorno della settimana e deve essere seguito da un numero tra 1 e 5 (dopo aver specificato il giorno della settimana ovviamente). Permette di specificare costrutti come “il secondo venerdi” del mese specificato.

  • Punto interrogativo ( ? ): E’ usato al posto di ’*’ per lasciare i campi giorno del mese o giorno della settimana vuoto.

E’ possibile comunque vedere i crontab presenti nel sistema per l’utente corrente tramite il comando:

crontab -l

Oppure è possibile editare e/o visualizzare il file crontab di un specifico utente

crontab -u(user)    <- modifica i crontab di (user)
crontab -u(user) -l <- visualizza i crontab di (user)

Dove (user), comprese le parentesi tonde sta per il nome dell’utente presente nella macchina, ovviamente bisogna avere i privilegi abilitati per modificare il file di crontab dell’utente specificato.

Per maggiori informazioni sui comandi supportati da crontab invito la lettura del suo manuale tramite shell:

man crontab