back to top

crontab: operazioni pianificate su Linux

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

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).