Soprattutto se avete già un minimo di esperienza nell'ambito dei server Linux, avrete probabilmente sentito la necessità di pianificare delle azioni che avvengano in automatico senza dover impartire i comandi da remoto: aggiornare l'IP del DNS dinamico, rinnovare il certificato HTTPS, ripulire la cartella di log, riavviare il webserver, eccetera.

Fortunatamente, è disponibile un comodo strumento che permette di gestire il tutto in maniera centralizzata ed efficiente: crontab.

Pianificare operazioni automatico Linux: guida crontab

INSTALLAZIONE DI CRONTAB

Normalmente, crontab dovrebbe essere già presente nelle distribuzioni Linux più diffuse. Tuttavia, nel caso in cui così non fosse, è possibile installarlo con questo comando:

sudo apt install cron

AGGIUNGERE E RIMUOVERE OPERAZIONI PIANIFICATE

Tutte le operazioni pianificate si trovano in uno dei file di configurazione di crontab; ne può esistere uno per ogni utente del sistema.

Nota: i comandi pianificati nel crontab di un dato utente verranno eseguiti con i suoi privilegi; perciò, per eseguire script o comandi che richiedono i privilegi di root, dovrete andare a modificare il crontab dell'utente root, anteponendo "sudo" ai comandi successivi.

Per verificare l'esistenza di un file di crontab per il vostro utente, impartite:

crontab -l

Se non vi siete mai interessati dell'argomento, la risposta più probabile sarà "no crontab for <nomeutente>".

A questo punto, potete creare o modificare il vostro file di configurazione con il comando:

crontab -e

Vi verrà mostrata una lista di editor di testo tra cui scegliere per modificare il file; probabilmente vi sarà consigliato di scegliere nano, poiché è ritenuto più semplice da usare rispetto ad altri editor come Vim, almeno per quanto riguarda l'utente medio.

Pianificare operazioni automatico Linux: guida crontab - scelta-editor-crontab

Inoltre, come potete notare, è sempre possibile cambiare la propria scelta aggiungendo l'opzione "select-editor" al comando.

Una volta arrivati qui, avrete davanti un semplice file di testo che, per il momento, dovrebbe contenere solo alcuni commenti con istruzioni e informazioni sulla sintassi e sul funzionamento del programma.

Ogni operazione pianificata è rappresentata da una riga, che a sua volta è divisa in due parti: la prima, che contiene le istruzioni temporali per stabilire in quali momenti eseguire il comando, mentre la seconda è costituita dal comando stesso.

In particolare, nella prima parte abbiamo cinque "campi" da riempire:

  1. Il minuto dell'esecuzione (val. 0-59)
  2. L'ora dell'esecuzione (val. 0-23)
  3. Il giorno del mese (val. 1-31)
  4. Il numero del mese (val. 1-12)
  5. Il giorno della settimana in numero (0 = domenica, 1 = lunedì, ecc.)

Ognuno di questi valori può anche essere sostituito con un asterisco (*), per indicare qualsiasi valore (ad esempio, un asterisco nel numero del mese significa che il comando verrà eseguito ogni mese nel giorno x, all'ora y e al minuto z).

Per inserire valori multipli, è necessario separarli con una virgola (ad esempio, inserire "2,5,7" nella colonna del giorno del mese significa che il comando sarà eseguito il 2, il 5 e il 7 di gennaio, febbraio, ecc...).

Nella seconda parte della riga, andrete ad inserire il percorso completo dello script/programma da eseguire. Proponiamo come esempio una riga per cancellare tutti i download vecchi di un mese in automatico:

0 12 1 * * /home/user/cancella-download.sh

Se analizziamo la riga, capiamo che lo script indicato nella seconda parte di essa (che supponiamo contenga istruzioni per rimuovere i file della cartella Download) sarà eseguito:

  • alle ore 12:00 (0 12)
  • del giorno 1 del mese (1)
  • di ogni mese (*)
  • qualunque sia il giorno della settimana (*)

Quando avete terminato, salvate e chiudete il file e riavviate il servizio con il comando:

sudo service cron restart

BONUS: STRINGHE SPECIALI PRONTE ALL'USO

Per semplificare il processo, è possibile utilizzare, in alcuni casi, delle stringhe già pronte che sostituiscono i cinque parametri numerici. Esse sono:

  • @reboot (ad ogni riavvio)
  • @yearly o @annually (il primo gennaio di ogni anno)
  • @monthly (il primo giorno di ogni mese)
  • @weekly (ogni domenica a mezzanotte)
  • @daily o @midnight (allo scoccare di ogni mezzanotte)
  • @hourly (allo scoccare di ogni ora)