Cron e crontab sono due importantissime applicazioni native dei sistemi unix-like, che permettono di pianificare delle operazioni da eseguire con cadenza regolare.
Cron è utilissimo per eseguire le operazioni più disparate: supponiamo ad esempio di avere in gestione un server remoto, con la necessità di svuotare ad un’orario indecente (ad esempio, alle 3 di notte) la cartella log del firewall. Grazie a Cron e crontab non ci sarà bisogno di alzarsi e collegarsi al server remoto, ma si può “istruire” il sistema operativo a farlo autonomamente.
Cron e crontab tuttavia non sono la stessa cosa: crontab è l’applicazione che – in parole povere – permette agli utenti di programmare le operazioni, mentre cron è il demone che si ricorda di eseguirle. In pratica cron “sorveglia” determinate cartelle (che variano di sistema in sistema) alla ricerca di operazioni da eseguire.
Scopriamo come usare e configurare cron e crontab.
Guida a cron
Capire se cron è in esecuzione sul sistema
Sebbene alcune distribuzioni (in particolare quelle ancora basate su upstart) non vi abbiano rinunciato, è possibile che le distribuzioni più moderne e basate su Systemd abbiano sostituito cron con i timer di Systemd stesso. Per verificare che il servizio relativo a cron sia attivo (deve esserlo affinché le programmazioni funzionino) su una distribuzione basata su systemd, è necessario aprire un terminale e digitare
systemctl status cron
ed assicurarsi che l’output (in particolare la riga che definisce il servizio “Attivo”) sia simile a questo:
Per verificare che cron sia attivo sui sistemi operativi basati su upstart, è sufficiente digitare invece
service cron status
Pianificare un comando con cron/crontab
Crontab è il nome dell’applicazione e contemporaneamente il nome dei file utilizzati per il suo funzionamento; per evitare confusione, in questa guida definiremo crontab l’applicazione e “cronfile” i file di configurazione. Du fatto, i “cronfile” sono file dotati di una sintassi ben precisa che “istruiscono” cron su cosa fare e quando.
Esistono due tipi di crontab/cronfile: quelli locali, ovvero relativi alle operazione eseguite con runlevel utente, e quelli di sistema, che devono risiedere in specifiche cartelle e che definiscono le operazioni eseguibili anche in runlevel kernel. La differenza è sottile ma molto importante a livello di sicurezza: nei cronfile di sistema è possibile far sì che le operazioni vengano eseguite con i privilegi di root, mentre nei cronfile utente ciascuna operazione specificata in essi viene eseguita solo e soltanto con i permessi dell’utente che ha schedulato le operazioni.
Iniziamo col comprendere come scrivere un cronfile utente. Per procedere in maniera scorrevole, bisogna innanzitutto definire:
- il comando/l’operazione da eseguire;
- il giorno/i giorni della settimana in cui eseguirla;
- la cadenza di esecuzione annuale (tutti i mesi? mesi specifici?);
- la cadenza di esecuzione mensile (tutti i giorni del mese? Soltanto giorni specifici?)
- la cadenza di esecuzione giornaliera (a quali ore? ogni quante ore? ogni quanti minuti?).
Come esempio, supponiamo di voler utilizzare cron/crontab per creare “una sveglia” che riproduca giornalmente un file audio. Le domande precedenti, nel nostro esempio, troverebbero questa risposta:
- il comando da eseguire è vlc (/usr/bin/vlc) per riprodurre un file dal nome Tfpa.mp3 (in /home/malefika/musica);
- la sveglia deve suonare tutti i giorni della settimana, domenica esclusa;
- la sveglia deve essere attiva per l’intero mese di marzo;
- la sveglia deve suonare tutti i giorni del mese (domeniche escluse, ma questo vien gestito nel punto superiore);
- la sveglia deve suonare alle 7 di ogni giorno.
Per darlo “in pasto” a crontab e dunque attivare questa routine, il tutto va tradotto seguendo la precisa sintassi del cronfile, che ha un template simile a quanto vedete in basso – una riga per ogni comando e ultima riga vuota, importante altrimenti cron non eseguirà le routine:
minuto(0-59) ora(0-23) giorno(mese,1-31) mese(1-12) giorno(settimana,0-6) comando 1
minuto(0-59) ora(0-23) giorno(mese,1-31) mese(1-12) giorno(settimana,0-6) comando 2
minuto(0-59) ora(0-23) giorno(mese,1-31) mese(1-12) giorno(settimana,0-6) comando 3
riga vuota (altrimenti il cron non va)
Ai giorni della settimana vanno associati i numeri da 0 a 6, con 0 = domenica e 6 = sabato; è chiaramente possibile specificare anche la wildcard jolly (l’asterisco, *) che significa “tutti”. E’ assolutamente sconsigliato usare il jolly nel campo minuti, poiché si rischia altrimenti di eseguire la stessa operazione in loop.
Si possono specificare anche dei periodi distanziati ma ben definiti, ad esempio: se si vuole eseguire l’operazione nei mesi di marzo, aprile e luglio, si potrà scrivere nel campo mese la stringa “03,04,07” (senza virgolette);
Effettuiamo, per seguire alla perfezione il template del crontab, una traduzione in “pseudocodice” della sveglia che intendiamo impostare:
- il comando: /usr/bin/vlc /home/malefika/musica/Tfpa.mp3
- il periodo settimanale (tutti i giorni della settimana, domenica esclusa): 01,02,03,04,05,06
- il periodo annuale (solo mese di marzo): 03
- il periodo mensile (tutti i giorni): *
- l’ora (alle 7, ricordando che sintatticamente vengono prima i minuti): 00 07
Ora basta leggere il tutto dal basso verso l’alto, separare ogni riga della lista in alto da uno spazio ed ecco composta la riga relativa alla sveglia da eseguire come comando, pronta da essere copiata nel nostro cronfile:
00 07 * 03 01,02,03,04,05,06 /usr/bin/vlc /home/malefika/musica/Tpfa.mp3
Per sicurezza, impostiamo ad esempio una seconda sveglia (con brano diverso) che suoni un quarto d’ora dopo:
15 07 * 03 01,02,03,04,05,06 /usr/bin/vlc /home/malefika/musica/sveglia2.mp3
Il cronfile relativo alla sveglia è ora completo; non resta che copiare le due righe in un file di testo semplice vuoto nella vostra directory home…
00 07 * 03 01,02,03,04,05,06 /usr/bin/vlc /home/malefika/musica/Tpfa.mp3
15 07 * 03 01,02,03,04,05,06 /usr/bin/vlc /home/malefika/musica/sveglia2.mp3
riga vuota (altrimenti il cron non va)
…e salvarlo con il nome cronsveglia, sempre nella home. Ora non resta che invocare il comando crontab per aggiungere la sveglia al demone che gestisce i crontab (crond), affinché cron possa eseguirla quando desiderato. Da terminale, bisognerà digitare semplicemente
cd ~ crontab cronsveglia
Se tutto è andato per il verso giusto le operazioni saranno state aggiunte al cron. Ora non resta che riavviare il servizio: se siamo su un sistema basato su Systemd, bisognerà digitare
sudo systemctl restart cron
mentre sui sistemi basati su Upstart bisognerà digitare
sudo service crontab restart
Infine, per verificare che il crontab sia stato aggiunto, bisognerà digitare sempre da terminale:
crontab -l
L’output dovrebbe essere pressappoco il seguente:
malefika:~$ crontab -l
00 07 * 03 01,02,03,04,05,06 /usr/bin/vlc /home/malefika/musica/Tpfa.mp3
15 07 * 03 01,02,03,04,05,06 /usr/bin/vlc /home/malefika/musica/sveglia2.mp3
Per eliminare invece tutti i cron attivi relativi all’utente corrente, è sufficiente digitare il comando
crontab -r
Per ulteriori approfondimenti, vi rimandiamo alle pagine di manuale di cron
man 8 cron #per cron man crontab #per crontab man 5 crontab #per i file di configurazione
TIP: esiste anche un servizio online che permette di creare crontab in pochi click, utile da avere sempre a disposizione; potrete trovarlo in questa pagina.