Tutorial > Come gestire le operazioni pianificate con Crontab su CentOS 8

Come gestire le operazioni pianificate con Crontab su CentOS 8

Pubblicato il: 10 giugno 2020

CentOS Web Hosting

Introduzione

Cron è uno strumento basato su Unix, e quindi utilizzabile su qualsiasi distro Linux, che permette di automatizzare l’esecuzione di diverse operazioni (scheduling) per la manutenzione o l'amministrazione del sistema.

Mediante Crontab potrai infatti pianificare attività, dette Cron Jobs, a intervalli specifici. Ad esempio potrai far ripetere un determinato comando o script ogni giorno a una certa ora, a distanza di un numero preciso di giorni oppure in una specifica data.

In questa guida vedrai come installare e utilizzare al meglio il demone di pianificazione Cron sul tuo server Linux con CentOS 8.

Per iniziare dovrai connetterti al tuo server tramite una connessione SSH. Se non l’hai ancora fatto, ti consigliamo di seguire la nostra guida per connetterti in sicurezza con il protocollo SSH. In caso di server locale puoi passare al punto successivo e aprire il terminale del tuo server.

Installazione di Cron

Molte distribuzioni Linux hanno Cron già installato di default. Qualora sul tuo server con CentOS non dovesse essere già preinstallato puoi installarlo interrogando direttamente i repository ufficiali.

Per prima cosa, aggiorna i pacchetti della tua macchina mediante il comando:

sudo dnf update

Procedi quindi all’installazione di Cron tramite:

sudo dnf install crontabs

Al termine dell’installazione Cron risulterà installato sul tuo sistema, ma ciò non significa che sia già in esecuzione. La prima volta bisogna infatti avviarlo manualmente, digitando:

sudo systemctl start crond.service

Consigliamo comunque di impostare Cron all’avvio del sistema così da non doverlo avviare manualmente ogni volta. Proprio poiché questo strumento permette di pianificare determinate azioni, potrebbe risultare scomodo doversi ricordare di avviarlo a ogni riavvio della macchina.

Per farlo digita quindi il seguente comando:

sudo systemctl enable crond.service

Pianificare un'operazione con Crontab

Tutte le automazioni che andrai successivamente a definire si chiamano jobs e sono salvati all’interno di un file chiamato crontab.

Esiste un crontab per ciascun profilo utente presente sul sistema. Ipotizzando che esista un solo utente, ricorda che le operazioni inserite nel file crontab per l’utente root non vengono eseguite per l’utente ‘non root’ e viceversa.

Per editare il tuo file crontab come utente ‘non root’ esegui il comando:

crontab -e

Si aprirà una schermata simile a un editor di testo, nel quale potrai impostare le caratteristiche di ciascun job. Cron rispetta una sintassi molto precisa, che prevede un elenco di parametri da definire e poi il comando o l'operazione da temporizzare.

È meglio chiarire quali sono i parametri da specificare affinché ciascun job venga eseguito correttamente:

  • Minute: va da 0 a 59 e indica il minuto in cui deve essere svolto il job
  • Hour: va da 0 a 23 e indica l’ora in cui deve essere svolto il job
  • DoM (Day of the Month): va da 1 a 31 e indica il giorno in cui deve essere svolto il job
  • Month: va da 1 (Gennaio) a 12 (Dicembre) e indica il mese in cui deve essere svolto il job
  • DoW (Day of the Week): va da 0 (Domenica) a 6 (Sabato) e indica il giorno della settimana in cui deve essere svolto il job.

Messi insieme questi parametri creano la struttura accettata da Cron per la pianificazione del comando. Più precisamente, la sintassi da rispettare è la seguente:

minute hour DoM Month Dow comando_da_eseguire 

Un esempio di comando accettato da Cron è il seguente:

 15 18 5 * * curl http://www.google.com >> google_curl.txt  

Il job così definito assume questo significato:

  • Al minuto 15
  • Alle ore 18
  • Il giorno 5
  • Di ogni mese (*)
  • Indipendente dal giorno (*)
  • Esegui una curl al sito http://www.google.com ed aggiungi il risultato al file “google_curl.txt”.

Come avrai notato è stato inserito il carattere speciale “*” il quale assume come significato “tutti i valori assumibili in questo campo”.

Tuttavia non è l’unico carattere speciale che si può utilizzare durante la definizione della propria operazione pianificata. Gli altri sono:

  • ”,”: qualora volessi specificare che uno stesso job debba essere eseguito in diversi momenti, anziché scrivere due jobs uguali è possibile definire i vari momenti in un unico job. Di conseguenza, se si volesse far ripetere un comando preciso sia alle 8.30 che alle 8.45 è possibile scrivere “30,45 8 * * * comando”.
  • ”-”: qualora volessi far ripetere un tuo jobs 10 volte a distanza di un minuto, anziché creare 10 jobs diversi puoi usare questo carattere per definire un range di valori sul campo interessato (in questo caso lo si applica sui minuti). In tal caso, il comando assumerebbe una sintassi simile alla seguente: “1-10 * * * * comando”.
  • ”/”: qualora volessi far ripetere un tuo jobs ogni volta dopo un valore prestabilito di tempo dovrai affiancare questo simbolo al carattere speciale “*” in maniera tale che la divisione tra il valore assunto dal carattere “*” ed il divisore restituisca un numero intero. Ad esempio, qualora volessi far ripetere un jobs ogni 2 ore precise, dovresti definirlo seguendo la seguente sintassi: “* */2 * * * comando”.
    N.B. Per le ore gli unici valori ammessi sono 1,2,3,4,6,8 e 12.

Ora che sai come configurare tutti i tuoi possibili job, ecco di seguito alcuni jobs di esempio.

Esempi di jobs

N.B. Per comodità ciascuna istruzione è stata raccolta sotto il nome “command”, il quale non rappresenta un effettivo comando e chiaramente andrà sostituito con l'operazione che volete pianificare.

Nella figura soprastante sono elencati 5 esempi di jobs inseriti nel file crontab:

  • command_1 viene eseguito ogni minuto
  • command_2 viene eseguito ogni 10 minuti di tutte le ore di tutti i giorni
  • command_3 viene eseguito ogni giorno a ogni ora al minuto 30
  • command_4 viene eseguito ogni giorno a ogni ora ad un intervallo di 30 minuti (è equivalente al significato del command_3)
  • command_5 viene eseguito ogni Giovedì, Venerdì e Sabato alle ore 15:30.

Per aggiungere i tuoi jobs al file crontab è necessario eseguire, come specificato prima, il comando crontab -e.

N.B. Tieni in considerazione che su CentOS il file crontab verrebbe aperto con l'editor Vi, il quale è uno strumento molto potente ma altrettanto complicato da utilizzare per un utente alle prime armi. Qualora non conoscessi come utilizzare questo editor di testo, ti consigliamo la lettura del nostro tutorial su Come utilizzare Vim.

Per iniziare a editare il file crontab, dopo aver eseguito il comando crontab -e premi il tasto “i” e inserisci quindi le istruzioni dei tuoi jobs. Al termine premi ESC e successivamente digita “:wq” per salvare le modifiche e chiudere l’editing del file.

Limitare l’accesso a Crontab

Come spiegato in precedenza, ciascun utente presente nel tuo sistema può definire i propri jobs poiché esiste per ciascuno di questi utenti, un file crontab dedicato.

Tuttavia è possibile definire con precisione per quali utenti sia possibile definire questo tipo di operazioni, agendo sui file cron.allow e cron.deny i quali rappresentano rispettivamente una white list e una black list per l’accesso a Cron.

Qualora volessi adottare questa politica di restrizione, devi aggiungere inizialmente tutti i tuoi utenti al file cron.deny e poi consentire l’accesso individualmente a ogni utente indicandone il nome all’interno file cron.allow.

Per negare a tutti l’accesso al proprio crontab, digita:

sudo echo ALL >>/etc/cron.deny

Qualora volessi invece autorizzare un utente, ti basterà digitare:

sudo echo user_name >>/etc/cron.allow

N.B. Sostituisci il campo “user_name” con il nome dell’utente da voler autorizzare.

È possibile per un utente con i privilegi di amministrazione modificare il file crontab di un altro utente presente nel sistema. Per effettuare questo tipo di modifica bisogna eseguire il comando:

sudo crontab -u user_name -e

N.B. Sostituisci il campo “user_name” con il nome dell’utente del quale vuoi editare il file crontab.

Qualora l’utente del quale si cerchi di modificare il file crontab sia presente nel file cron.deny, ma non sia stato aggiunto al file cron.allow, si riceverebbe un messaggio di errore che avvisa che tale utente non è abilitato a utilizzare Cron.

Scorciatoie di Cron

Il demone Cron prevede alcune scorciatoie che possono semplificare la definizione dei jobs.

In particolare, esistono delle parole (seguite dal simbolo “@”) che assumono un preciso significato e rendono quindi più veloce la stesura dei jobs perché possono essere utilizzate nella sintassi in sostituzione della specifica della data a cinque colonne. Le scorciatoie di Cron sono le seguenti:

  • @hourly: esegue il comando all'inizio di ogni ora, è equivalente a “0 * * * * “
  • @daily: esegue il comando ogni giorno a mezzanotte, è equivalente a “0 0 * * *”
  • @weekly: esegue il comando ogni settimana alla mezzanotte di domenica, è equivalente a “0 0 * * 0”
  • @monthly: esegue il comando ogni mese a mezzanotte del primo giorno del mese, è equivalente a “0 0 1 * *”
  • @yearly: esegue il comando ogni anno a mezzanotte del primo gennaio, è equivalente a “0 0 1 1 *”
  • @reboot: esegue il comando a ogni riavvio del sistema.

Conclusioni

Se sei un sysadmin e gestisci uno o più server, Cron è sicuramente uno strumento molto utile nella tua quotidianità. Grazie a questa guida hai imparato come pianificare operazioni con Crontab in una data e a un orario specifico.

Gli utilizzi di Cron possono essere fra i più svariati. Se ad esempio sulla macchina che gestisci hai necessità di effettuare dei backup automatici, utilizzare Cron potrebbe essere una valida alternativa ad altri sistemi, a patto di definire manualmente i jobs per la copia e sincronizzazione.