Crontab: pianifichiamo i lavori nel tempo

Cron è un demone per schedulare i lavori nel tempo, sui sistemi Unix-like. Come tutti i demoni gira in background ed esegue automaticamente i compiti assegnati.

Installiamo crontab

Prendiamo come prerequisito che stiamo lavorando su una macchina Linux su base Debian. Quindi utilizziamo il package manager apt. Se fossimo su una macchina RedHat useremmo yum o dnf.

crontab lavori pianificati in linux

Installare crontab è piuttosto facile e basta un solo comando lanciato da amministratore. Per precauzione aggiorniamo i repository prima di farlo

sudo apt update
sudo apt install crontab

Una volta installato, poichè dobbiamo eseguire cron come servizio (o demone che dir si voglia) usiamo il gestore dei servizi per avvialo e per abilitarlo all’avvio automatico in caso di riavvio del sistema.

sudo systemctl start crond
sudo systemctl enable crond

A questo punto il servizio è attivo e possiamo iniziare ad inserire i lavori.

Il principio di funzionamento dei lavori di crontab

In linea di massima tutti i lavori, ognuno su una riga diversa, dovrebbero essere gestiti dall’utente di amministrazione, cosi da avere i permessi di lettura e scrittura in qualsiasi parte del disco.

Ci sono alcuni casi in cui i lavori sono tipici di un solo utente possono essere eseguiti all’interno del crontab di quell’utente, che non sarà visibili e modificabile dagli altri utenti.

Ogni riga di comando deve essere letta con il seguente schema

# ┌───────────── minuti (0 - 59)
# │ ┌───────────── ore (0 - 23)
# │ │ ┌───────────── giorni del mese (1 - 31)
# │ │ │ ┌───────────── mesi(1 - 12)
# │ │ │ │ ┌───────────── gionrni della settimana (0 - 6) (Domenica a  to Saturday;
# │ │ │ │ │                                   7 la domenica in alcuni sistemi)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>

Ad esempio questo comando scrive nel file lavori.log la data ed il testo ogni minuto

* * * * * echo [$(date)] Run this command every minute >> /var/log/lavori.log

Possiamo inserire esattamente questo comando all’interno del nostro servizio con l’ausilio di VI senza neanche chiamarlo. Infatti usiamo il programma che abbiamo installato per lanciare l’editor, per cancellare tutti i lavori o per listarli

sudo crontab -e ##modifica il file
sudo crontab -l ##elenca i lavori
sudo crontab -r ##cancella tutto il file

Ci sono alcuni caratteri speciali che si possono includere nella schedulazione dei componenti delle espressioni per semplificare il lavoro:

  • *: L’asterisco è una ‘wildcard’ ovvero una variabile che rappresenta ‘tutto’. Quindi un lavoro schedulato con * * * * * ... viene eseguito ogni minuto di ogni ora in ogni giorno, ogni mese dell’anno.
  • ,: La virgola permette di suddividere i valori in una lista. Quindi un lavoro schedulato con 0,30 * * * * ...viene eseguito al minuto :00 ed al minuto :30 di ogni ora.
  • -: Il trattino indica un range di valori. Invece di avere una lista consecutiva separata dalla virgola, possiamo raggrupparli con il trattino. In pratica ‘da a’.
    Quindi un lavoro schedulato con 0 12-15 * * * ... viene eseguito ogni ora dalle 12:00 alle 15:00 di ogni giorno dell’anno.
  • /: La barra in avanti o forward slash abbinata ad un asterisco, permette di creare degli step. Quindi un lavoro schedulato con 0 */3 * * * ... viene eseguito ogni 3 ore tutti i giorni dell’anno.