Spesso capita di aver la necessità di far partire automaticamente una certa operazione ad un dato momento del giorno o ad un dato giorno della settimana (si pensi, ad esempio, ai processi automatici di backup o di archiviazione dei log). Per fare ciò su Windows utiliziamo l’utilità di pianificazione (Task Scheduler), su Linux utilizzeremo il crontab.
I cron job
Grazie a crontab, infatti, possiamo impostare (o, più correttamente, schedulare) delle operazioni (job) sul nostro sistema Linux con una certa semplicità sfruttando il demone cron. Le attività pianificate prendono il nome di cron job.
Il "cron daemon", infatti, legge il file crontab
ed segue le operazioni ivi impostate (i cron job) al momento specificato ed in modo del tutto automatico.
Ogni utente del nostro O.S. Linux, ovviamente, può avere la propria versione di questo file; in questo modo, pertanto, possiamo avere diverse operazioni pianificate in esecuzione sullo stesso sistema.
Il comando crontab
La sintassi del comando è la seguente:
crontab -u username -opzione
L’opzione -u
consente di specificare il nome dell’utente che "possiede" il file. Se l’opzione -u
è omessa, il sistema presumerà che state operando sul vostro crontab personale.
L’opzione list (l)
Con l’opzione -l
(list) possiamo vedere il contenuto attuale del nostro crontab. L’utilizzo è questo:
crontab -l
L’opzione remove (r)
Specificando l’opzione -r
(remove) andremo ad eliminare tutte le operazioni pianificate eventualmente impostate all’interno del nostro crontab. Così:
crontab -r
L’opzione edit (e)
Con -e
(edit) possiamo inserire, modificare o eliminare cron job dal nostro crontab
. Il comando da utilizzare è questo:
crontab -e
Così facendo si aprirà automaticamente il nostro editor di testo predefinito (generalmente pico o VI). Se è la prima volta che utilizzate crontab può essere che vi ritroviate di fronte ad una pagina vuota… andiamo quindi ad inserire la nostra prima operazione pianificata!
Definire le singole operazioni all’interno del crontab
All’interno del nostro crontab
possiamo inserire quante operazioni desideriamo. Ogni operazione (cron job) deve contenere necessariamente l’orario e la data di esecuzione nonché, ovviamente, l’indicazione del comando che si desidera eseguire. Per inserire più operazioni è sufficiente andare a capo (ogni operazione occupa una riga).
Per comprendere meglio la sintassi delle operazioni pianificate vediamo un primo semplice esempio:
00 00 * * * /usr/bin/updatedb
Nell’operazione specificata qui sopra abbiamo detto al nostro demone cron di eseguire il comando "updatedb" (specificandone il percorso assoluto) tutti i giorni al minuto 00 dell’ora 00, quindi a mezzanotte esatta.
Prima dell’indicazione del comando da eseguire vanno inseriti nell’ordine (da sinistra verso destra):
- minuto
- ora
- giorno del mese
- mese
- giorno della settimana
L’utilizzo dell’asterisco (*) significa "tutti". Se quindi lo utilizziamo al posto del giorno del mese, ad esempio, il comando verrà eseguito tutti i giorni del mese.
Alcune versioni di cron supportano l’operatore slash (/) che viene utilizzato per pianificare delle ripetizioni. Facciamo un esempio:
*/10 * * * * /usr/bin/updatedb
Nel nostro esempio il valore dei minuti è stato impostato come */10; ciò significa che la nostra operazione sarà eseguita ogni 10 minuti.
E’ anche possibile specificare degli intervalli: per farlo si usa il trattino (-). Facciamo un esempio:
00 15 1-4 * * /usr/bin/updatedb
Nel nostro esempio l’operazione verrà eseguita alle 15:00 nei primi quattro giorni di ogni mese.
Oltre a slash e trattino possiamo usare anche la virgola (,) la quale viene utilizzata per specificare un elenco. Facciamo un esempio:
30 18 1 3,6,9 * /usr/bin/updatedb
Nel nostro esempio l’operazione verrà eseguita alle 18:30 del primo giorno del mese di marzo (3), giugno (6) e settembre (9).
Stringhe speciali
E’ possibile sostituire i primi cinque valori (cioè quelli che riguardano data e ora di esecuzione del comando) con delle stringhe "speciali" che assolvono al medesimo compito. Queste stringhe sono:
- @reboot – lancia il comando all’avvio del sistema
- @yearly – lancia il comando una volta all’anno; corrisponde a "0 0 1 1 *"
- @annually – (analogo @yearly)
- @monthly – lancia il comando una volta al mese; corrisponde a "0 0 1 * *"
- @weekly – lancia il comando una volta alla settimana; corrisponde a "0 0 * * 0"
- @daily – lancia il comando una volta al giorno; corrisponde a "0 0 * * *"
- @midnight – (analogo @daily)
- @hourly – lancia il comando una volta all’ora; corrisponde a "0 * * * *"
Vediamo un esempio di operazione pianificata relativa ad un backup quotidiano:
@daily /usr/bin/backup
Inserire commenti all’interno del crontab
E’ anche possibile aggiungere dei commenti all’interno del crontab per inserire annotazioni utili per successive modifiche o implementazioni relative ai vari cronjob. L’inserimento di commenti è molto semplice: è sufficiente inserire una linea di testo il cui primo carattere corrisponde ad un cancelletto (#).
Vediamo un esempio:
# imposto un backup giornaliero
@daily /usr/bin/backup
Soluzioni automatiche per la compilazione del crontab
In rete esistono anche alcuni tool on-line che consentono di scrivere, in modo guidato ed estremamente semplice, delle istruzioni da inserire all’interno del crontab. Tra gli strumenti di questo genere segnalo il crontab generator disponibile su Toolset.it