## page was renamed from CronHowTo
##docs intrepid
#format wiki
#language it
<<Indice(depth=1)>>
<<Informazioni(forum="http://forum.ubuntu-it.org/viewtopic.php?f=46&t=132669&p=875872"; rilasci="22.04 20.04 19.10 18.04 16.04")>>

= Introduzione =

Il servizio '''cron''' viene utilizzato per eseguire le azioni pianificate. Le informazioni necessarie a programmare ogni singola azione (con relativi tempi e procedure) sono indicate nel file di configurazione '''crontab'''.

 * Per consultare il manuale di '''cron''' digitare il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]: {{{
 man cron
}}}
 * Per la sintassi del file '''crontab''' digitare:{{{
 man 5 crontab
}}}

= Creare e modificare un crontab personalizzato =

Il sistema ha un suo file di '''cron''' (presente in `/etc/crontab`), ma ogni utente può creare il proprio. Per creare un file di '''cron''' è sufficiente digitare nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
crontab -e
}}}

Il precedente comando apre un [[Ufficio/EditorDiTesto|editor di testo]] contenente un documento vuoto nel quale andranno inseriti i comandi desiderati; tale file andrà salvato con il nome e nel percorso suggeriti dall'editor. Se la sintassi dei comandi non è corretta le azioni non verranno eseguite.

Una volta chiuso l'editor, il nuovo file di '''crontab''' verrà salvato in `/var/spool/cron/crontabs`.

{{{#!wiki note
I file di '''crontab''' possono essere modificati solo con il comando '''crontab -e'''.
}}}

Per vedere se il sistema ha salvato correttamente il proprio file di '''cron''', digitare il seguente comando:{{{
crontab -l
}}}

Verrà stampato l'elenco dei '''crontab''' registrati per l'utente corrente; in assenza di file di '''cron''' validi il risultato sarà simile al seguente:{{{
no crontab for nomeutente
}}}

= Sintassi dei comandi =

Il file '''crontab''' deve rispettare una sintassi ben precisa, diversamente il sistema non accetterà le impostazioni. Quello che segue è un esempio generico:{{{
5 3 * * * /usr/bin/apt-get update
}}}

L'esempio precedente eseguirà il comando '''apt-get update''' ogni giorno di ogni mese alle ore 03:05 (l'orario viene indicato nel formato a 24 ore). 

La prima parte della voce descrive quando l'azione deve essere effettuata. Ci sono cinque campi (nell'esempio precedente, «5 3 * * *»), separati da uno spazio, ognuno dei quali accetta un numero, un asterisco o un testo appropriato. I campi specificano, in ordine (tra parentesi l'abbreviazione standard):
 * minuti, da 0 a 59 ('''m''');
 * ore, da 0 a 23 ('''h''');
 * giorno del mese, da 1 a 31 ('''dom'''); 
 * mese, da 1 a 12 ('''mon''');
 * giorno della settimana, da 0 (Domenica) a 6 (Sabato) ('''dow'''). 

Il campo del mese e quello del giorno della settimana permettono di usare un'abbreviazione, come ad esempio '''jan''' per Gennaio (in inglese January) o '''thu''' per Giovedì (in inglese Thursday). Quello che segue è un esempio del contenuto di un '''crontab''' di sistema (`/etc/crontab`):
{{{
m h dom mon dow user  command
17 *  * * * root    run-parts --report /etc/cron.hourly
25 6  * * * root  test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily
47 6  * * 7 root  test -x /usr/sbin/anacron || run-parts --report /etc/cron.weekly
52 6  1 * * root  test -x /usr/sbin/anacron || run-parts --report /etc/cron.monthly
}}}

L'asterisco «*» consente di non specificare alcun valore per il campo in cui viene inserito.<<BR>>
Il parametro '''user''' (che indica con quale utente va eseguito il comando) è presente solo nella '''crontab''' di sistema, manca nella '''crontab''' utente e in quella di root.<<BR>>
Quello che segue è un esempio utile a chiarire l'uso della sintassi:
{{{
12 03 * * 1,4 /percorso/script.cgi
}}}

Segue la spiegazione dei singoli parametri:
 * '''12''': minuti; 
 * '''03''': ore;
 * '''*''': giorno del mese (tutti i giorni);
 * '''*''': mese (tutti i mesi);
 * '''1,4''': giorni della settimana, separati da una virgola (il Lunedì e il Giovedì);
 * '''/percorso/comando''': comando da eseguire;.

Una volta impostata tale pianificazione, ogni Lunedì e Giovedì, alle ore 3:12, verrà eseguito il comando '''/percorso/comando'''.<<BR>>
Quelle che seguono sono alcune varianti della precedente pianificazione d'esempio:

||<:>'''Stringa''' ||<:>'''Descrizione''' ||
||'''12 03 * * *'''   || tutte le mattine, più o meno alle 3             ||
||'''12 03 15 * *'''  || tutti i 15 del mese, alla stessa ora            ||
||'''12 03 31 * *'''  || 7 volte l'anno, alla stessa ora                 ||
||'''0 12 * * 0'''    || ogni domenica, a mezzogiorno                    ||
||'''2 0 * * *'''     || ogni giorno, più o meno a mezzanotte            ||
||'''02 03 * * 1,5''' || ogni Lunedì e Venerdì, alle 3 del mattino circa ||

Seguono ulteriori esempi:
 * stampare un messaggio ogni 5 minuti, dalle 9 alle 17 da Lunedì a Venerdì:{{{
*/5 9-17 * * mon,tue,wed,thu,fri wall "Siamo ancora qui?"
}}}
 * ricordare un compleanno alle 9 di mattina del 10 Gennaio di ogni anno:{{{
0 9 10 jan * echo "È il compleanno di tua madre oggi!" > ~/readme
}}}

== Stringhe speciali ==

Grazie ad alcune stringhe speciali è possibile in certi casi semplificare la sintassi dei comandi visti in precedenza, semplicemente sostituendo il carattere speciale ai cinque valori. Vengono qui riportati alcuni esempi:

||<:>'''Stringa''' ||<:>'''Eseguire comando:''' ||
||'''@reboot'''     || una volta all'avvio                  ||
||'''@yearly'''     || una volta all'anno (0 0 1 1 *)       ||
||'''@annually'''   || ..come @yearly                       ||
||'''@monthly'''    || una volta al mese (0 0 1 * *)        ||
||'''@weekly'''     || una volta alla settimana (0 0 * * 0) ||
||'''@daily'''      || una volta al giorno (0 0 * * *)      ||
||'''@midnight'''   || ..come  @daily                       ||
||'''@hourly'''     || una volta all'ora (0 * * * *)        ||

{{{#!wiki note
'''@reboot''' viene eseguito dopo la partenza del daemon cron, dunque in realtà qualche secondo '''dopo''' il reboot.
}}}

= Gestione dei crontab =

Per vedere quali '''crontab''' utente sono in esecuzione sul sistema è sufficiente digitare il seguente comando:{{{
crontab -l
}}}

A seconda dei comandi che si desidera utilizzare, potrebbe essere necessario modificare la variabile d'ambiente «PATH», inserendo la seguente linea all'inizio del file di '''crontab''':{{{
PATH=/usr/sbin:/usr/bin:/sbin:/bin
}}}

= Crontab per comandi root =

Il file '''crontab''' dell'utente contiene comandi che verranno eseguiti con il livello di permessi dell'utente stesso. Se si desidera pianificare un'azione che richiede i [[AmministrazioneSistema/PrivilegiDiAmministrazione/Sudo|privilegi di amministrazione]] è possibile creare un file di '''crontab''' per l'utente '''root''' con il seguente comando:{{{
sudo crontab -e
}}}

Il formato delle righe nella nella '''crontab''' di '''root''' è uguale a quello della '''crontab''' utente.
Qui sotto un esempio di una riga inserita nella '''crontab''' di '''root''' perchè deve agire su un file di sistema. 
{{{
@reboot echo "disable" > /sys/firmware/acpi/interrupts/gpe03
}}} A ogni reboot disabilita l'interrupt gpe03. 

Anche i comandi nella crontab di sistema `/etc/crontab` vengono eseguiti per tutti gli utenti ma non conviene modificarla perché le modifiche potrebbero andare perse per un aggiornamento di sistema.

= Eseguire backup periodici =

Uno degli utilizzi più frequenti del comando '''cron''' riguarda l'esecuzione periodica del backup dei dati. Nel seguente esempio '''cron''' eseguirà un backup giornaliero, alle ore 19:30, della cartella `/home/utente/Documenti` e delle sue sottocartelle, creando un file di archivio dal nome `/backup_utente.tgz`.
{{{
30 19 * * * tar -cvpzf /backup_utente.tgz /home/utente/Documenti
}}}

= Verificare le impostazioni =

Per verificare il corretto funzionamento di '''cron''' è sufficiente impostare un'azione da eseguire pochi minuti dopo la modifica del file di '''crontab''' e osservare il risultato. A tale scopo è utile inserire il comando in un file che terrà traccia del successo o del fallimento dell'esecuzione, come nell'esempio seguente:{{{
echo "Backup riuscito: $(date)" >> /tmp/mybackup.log
}}}

I comandi eseguiti da '''cron''' vengono riportati in '''/var/log/syslog''' dunque si possono verificare con '''journalctl'''. 

= Ulteriori risorse =

 * [[Ubuntu:CronHowto|Documento originale]]
 * [[AmministrazioneSistema/BackupDelSistema/BackupConTar|Guida al backup con tar]]
----
CategoryAmministrazione