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.
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.
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:
- Il minuto dell'esecuzione (val. 0-59)
- L'ora dell'esecuzione (val. 0-23)
- Il giorno del mese (val. 1-31)
- Il numero del mese (val. 1-12)
- 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)