6 999
contributi
S3v (discussione | contributi) mNessun oggetto della modifica |
S3v (discussione | contributi) (aggiunto paragrafo "Strumenti grafici") |
||
(36 versioni intermedie di 5 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
{{Versioni compatibili}} | {{Versioni compatibili}} | ||
==Introduzione al servizio di scheduling Cron== | == Introduzione al servizio di scheduling Cron == | ||
Alcuni processi devono essere eseguiti a determinati orari, un determinato numero di volte. Esempi possono essere i processi di backup che vengono lanciati ogni notte, oppure un analizzatore di log che deve girare ogni minuto.<br/> | Alcuni processi devono essere eseguiti a determinati orari, un determinato numero di volte. Esempi possono essere i processi di backup che vengono lanciati ogni notte, oppure un analizzatore di log che deve girare ogni minuto.<br/> | ||
Questi processi devono girare un certo numero di volte oppure in determinati giorni; il resto del tempo essi stanno fermi fino a quando un utente non interagisce con essi e li richiama (con gli appositi comandi). Questi sono i casi in cui il demone CRON si rende utile. Vi permette di programmare (o "schedulare", come si dice in gergo) l'esecuzione di un lavoro in qualsiasi momento desideriate, ogni minuto, ogni ora, giornalmente, settimanalmente, mensilmente, annualmente. | Questi processi devono girare un certo numero di volte oppure in determinati giorni; il resto del tempo essi stanno fermi fino a quando un utente non interagisce con essi e li richiama (con gli appositi comandi). Questi sono i casi in cui il demone CRON si rende utile. Vi permette di programmare (o "schedulare", come si dice in gergo) l'esecuzione di un lavoro ("job" o "cronjob") in qualsiasi momento desideriate, ogni minuto, ogni ora, giornalmente, settimanalmente, mensilmente, annualmente. | ||
== Le basi == | == Le basi == | ||
Cron viene lanciato in background all'avvio del sistema | Cron viene lanciato in background all'avvio del sistema sicché non c'è bisogno di lanciarlo manualmente. All'avvio Cron legge il file <code>/etc/crontab</code> per le voci (le cosiddette "entry") di sistema, i file contenuti nella directory <code>/etc/cron.d/</code> e i file in <code>/var/spool/cron/crontabs</code> per le voci relative agli utenti che si trovano nel file <code>/etc/passwd</code>. Tutti i job di ciascuna voce (crontab) sono caricati nella memoria del demone Cron. | ||
== Utilizzare crontab == | Ciascun utente, compreso [[root]], ha il proprio file crontab nella directory <code>/var/spool/cron/crontabs/</code>; ogni crontab può contenere uno o più cronjobs. | ||
Il demone Cron legge i file contenuti in <code>/var/spool/cron/crontabs/</code> relativi ai | |||
Il [[demone]] Cron esegue diversi compiti: | |||
* Controlla eventuali cambiamenti nei file contenuti in <code>/etc/cron.d/</code> o nel file<code>/etc/crontab</code>. In questo caso aggiorna il modtime (vale a dire la data e l'ora dell'ultima modifica) per questi crontab e li ricarica nella sua memoria interna; | |||
* Monitora il comando <code>crontab</code> che si occupa, per ciascun utente, di modificare i lavori di Cron contenuti in <code>/var/spool/cron/crontabs</code>. Le modifiche effettuate con il comando <code>crontab</code> comportano, da parte di Cron, l'aggiornamento dei crontab in memoria e del loro modtime; | |||
* Confronta l'ora/data dei job contenuti in memoria (modtime) con l'ora/data corrente per stabilire se il comando schedulato debba essere avviato oppure no; | |||
In base a questo modo di operare, non è necessario far ripartire Cron ogni volta che vengono effettuati dei cambiamenti tramite il comando <code>crontab</code>. | |||
== Utilizzare il comando crontab == | |||
Il demone Cron legge i file contenuti in <code>/var/spool/cron/crontabs/</code> relativi ai cronjobs che ogni specifico utente vuole eseguire. È importante sapere che <u>questi file non vanno modificati direttamente</u>, ma solo attraverso il comando <code>crontab</code> seguito dagli appropriati flag che specificano se lanciare <code>crontab</code> per avere la lista o per aggiungere, rimuovere e modificare compiti. | |||
La sintassi per il programma <code>crontab</code> è la seguente: | La sintassi per il programma <code>crontab</code> è la seguente: | ||
Riga 23: | Riga 27: | ||
</pre> | </pre> | ||
I parametri significano: | I parametri significano: | ||
* <code>'''-u'''</code> : questa opzione comunica al sistema il nome dell'utente che "possiede" il file. Se l'opzione <code>-u</code> è omessa, il sistema deduce per default che | * <code>'''-u'''</code> : questa opzione comunica al sistema il nome dell'utente che "possiede" il file. Se l'opzione <code>-u</code> è omessa, il sistema deduce per default che si sta operando sul crontab dell'utente che lancia il comando. NOTA: Il comando switch user (<code>su</code>) può confondere il <code>crontab</code>, così se siete nello switch <code>su</code> assicuratevi di utilizzare l'opzione <code>-u</code>. | ||
* <code>'''-l'''</code> : questa opzione dice a <code>crontab</code> di elencare i file nello standard output, cioè di visualizzare il file. | * <code>'''-l'''</code> : questa opzione dice a <code>crontab</code> di elencare i file nello standard output, cioè di visualizzare il file. | ||
* <code>'''-e'''</code> : questa opzione dice a <code>crontab</code> di editare il file. Cron usa l'editor definito dalle variabili <code>EDITOR</code> o <code>VISUAL</code>. Se nessuna di queste due variabili è definita, parte in automatico [ | * <code>'''-e'''</code> : questa opzione dice a <code>crontab</code> di editare il file. Cron usa l'editor definito dalle variabili <code>EDITOR</code> o <code>VISUAL</code>. Se nessuna di queste due variabili è definita, parte in automatico [[Impostare_l%27editor_predefinito_della_shell|l'editor di default]]. L'editor salva il file in <code>/tmp</code>; quando si esce dall'editor, il file è immediatamente salvato in <code>/var/spool/cron/crontabs</code> e viene aggiornato il campo data/ora. '''Questo è il comando principale da utilizzare se si vuole modificare il proprio file crontab per cancellare o inserirvi i lavori da assegnare a Cron.''' | ||
* <code>'''-r'''</code> : questa opzione rimuove il file | * <code>'''-r'''</code> : questa opzione rimuove il file crontab. Se nessun utente viene specificato attraverso l'opzione '-u', rimuove il file crontab dell'utente che lancia il comando. | ||
* <code>'''file'''</code> : inserisce il contenuto del file nel crontab dell'utente specificato tramite l'opzione '-u'. Se non viene specificato nessun utente, allora il contenuto del file sarà inserito nel crontab dell'utente che lancia il comando (vedi anche: [[Utilizzo_del_servizio_di_scheduling_Cron#Importare_un_file_crontab | Importare un file crontab]]) | * <code>'''file'''</code> : inserisce il contenuto del file nel crontab dell'utente specificato tramite l'opzione '-u'. Se non viene specificato nessun utente, allora il contenuto del file sarà inserito nel crontab dell'utente che lancia il comando (vedi anche: [[Utilizzo_del_servizio_di_scheduling_Cron#Importare_un_file_crontab | Importare un file crontab]]) | ||
==cron.allow & cron.deny== | == cron.allow & cron.deny == | ||
In un sistema Debian, di default, tutti gli utenti, oltre root, possono eseguire il comando <code>crontab</code>.<br/> | In un sistema Debian, di default, tutti gli utenti, oltre root, possono eseguire il comando <code>crontab</code>.<br/> | ||
Questo comportamento può essere modificato attraverso la creazione di due file: | Questo comportamento può essere modificato attraverso la creazione di due file: | ||
Riga 36: | Riga 40: | ||
Se entrambi i file sono presenti, verrà preso in considerazione solo il file <code>/etc/cron.allow</code>.<br/> | Se entrambi i file sono presenti, verrà preso in considerazione solo il file <code>/etc/cron.allow</code>.<br/> | ||
Root è sempre abilitato all'utilizzo di <code>crontab</code>, indipendentemente dall'esistenza o meno di questi due file. | Root è sempre abilitato all'utilizzo di <code>crontab</code>, indipendentemente dall'esistenza o meno di questi due file e dal loro contenuto. | ||
== Voci in un file crontab == | |||
Solo due tipi di voci sono permesse in un file crontab: i settaggi ambientali (Crontab Environmental settings) e i settaggi di comando (Crontab Command settings). | |||
=== Crontab Environmental settings === | |||
===Crontab Environmental settings=== | |||
I settaggi ambientali utilizzano la seguente forma: | I settaggi ambientali utilizzano la seguente forma: | ||
<pre> | <pre> | ||
NOME = valore | NOME = valore | ||
</pre> | </pre> | ||
che, per motivi di leggibilità, dovrebbero essere inseriti in testa al file generato | che, per motivi di leggibilità, dovrebbero essere inseriti in testa al file generato dal comando <code>crontab</code>.<br/> | ||
Le variabili a cui è possibile assegnare un valore sono: | Le variabili a cui è possibile assegnare un valore sono: | ||
* <code>'''SHELL'''</code>: se non assegnata viene settata automaticamente da Cron a <code>/bin/sh</code> . | * <code>'''SHELL'''</code>: se non assegnata viene settata automaticamente da Cron a <code>/bin/sh</code> .<br/>Poiché in Debian l'interprete dei comandi a cui punta <code>/bin/sh</code> è <code>/bin/dash</code>, accertarsi che la sintassi dei comandi sia compatibile con '''dash'''; altrimenti modificare la variabile SHELL in maniera conforme all'interprete utilizzato, ad esempio:<pre>SHELL=/bin/bash</pre>Questa modifica potrebbe essere necessaria nel caso in cui si voglia eseguire attraverso Cron uno [[script]] Bash. | ||
* <code>'''PATH'''</code>: anche questa variabile, se non le viene assegnato un valore, è settata automaticamente da Cron a <code>/usr/bin:/bin</code> . È utile cambiare questo valore | * <code>'''PATH'''</code>: anche questa variabile, se non le viene assegnato un valore, è settata automaticamente da Cron a <code>/usr/bin:/bin</code> . È utile cambiare questo valore se i comandi contenuti all'interno di uno script lanciato da ''Cron'' utilizzano a loro volta comandi non presenti in ''/usr/bin'' o ''/bin'' oppure se si vuole inserire un comando senza specificarne il [[path]]. Per i comandi in <code>/usr/bin</code> e <code>/bin</code>, presenti cioè nel path di default, non è necessario specificarne il path completo. | ||
* <code>'''LOGNAME'''</code>: contiene il login name dell'utente che esegue <code>crontab</code>. Non può essere cambiata. | * <code>'''LOGNAME'''</code>: contiene il login name dell'utente che esegue il comando <code>crontab</code>. Non può essere cambiata. | ||
* <code>'''HOME'''</code>: contiene il path della home directory associata all'utente che esegue <code>crontab</code>. | * <code>'''HOME'''</code>: contiene il path della home directory associata all'utente che esegue <code>crontab</code>. | ||
* <code>'''MAILTO'''</code>: di default Cron invia un'email con l'output dei comandi presenti nel | * <code>'''MAILTO'''</code>: di default Cron invia un'email con l'output dei comandi presenti nel crontab all'utente che ne è proprietario.<br/> | ||
#se questa variabile è settata, il demone Cron invierà un'email, con l'output del/dei comando/comandi specificati in <code>crontab</code>, all'utente specificato. È possibile specificare più utenti separandoli con una virgola; | #se questa variabile è settata, il demone Cron invierà un'email, con l'output del/dei comando/comandi specificati in <code>crontab</code>, all'utente specificato. È possibile specificare più utenti separandoli con una virgola; | ||
#se la variabile è settata a "", allora non verranno inviate email;<br/> | #se la variabile è settata a "", allora non verranno inviate email;<br/> | ||
#se la variabile non è specificata, verrà inviata un'email all'utente a cui appartiene il | #se la variabile non è specificata, verrà inviata un'email all'utente a cui appartiene il crontab.<br/>La seguente riga mostra la variabile MAILTO settata ad uno specifico utente (luca):<pre># spedisce tutti gli output all'utente *luca* MAILTO=luca</pre>mentre la successiva riga informa Cron di non inviare email:<pre># non viene inviata nessuna email MAILTO=""</pre>ovviamente, affinché Cron possa inviare con successo le email, bisogna avere un MTA installato e funzionante sulla propria macchina. | ||
La seguente riga mostra la variabile MAILTO settata ad uno specifico utente (luca): | |||
<pre> | |||
# spedisce tutti gli output all'utente *luca* | |||
MAILTO=luca | |||
</pre> | |||
mentre la successiva riga informa Cron di non inviare email: | |||
<pre> | |||
# non viene inviata nessuna email | |||
MAILTO="" | |||
</pre> | |||
ovviamente, affinché Cron possa inviare con successo le email, bisogna avere un MTA installato e funzionante sulla propria macchina. | |||
=== Crontab Command settings === | === Crontab Command settings === | ||
I settaggi di comando usano un formato standard: ogni riga è composta da cinque campi ora/data seguiti da un campo contenente il comando da eseguire. Per il | I settaggi di comando usano un formato standard: ogni riga è composta da cinque campi ora/data seguiti da un campo contenente il comando da eseguire.<br/> | ||
Per il crontab di sistema ('''<code>/etc/crontab</code>''') e per i lavori di Cron presenti in <code>/'''etc/cron.d/'''</code>, vi è un settimo campo, compreso tra i primi cinque e il comando da eseguire, che contiene lo username dell'utente con i cui permessi verrà lanciato il comando.<br/> | |||
Vedremo in seguito che sono possibili alcune eccezioni a questa regola. | Vedremo in seguito che sono possibili alcune eccezioni a questa regola. | ||
Riga 82: | Riga 77: | ||
</pre> | </pre> | ||
Ecco lo schema per una generica linea presente in un file | Ecco lo schema per una generica linea presente in un file crontab: | ||
<pre> | <pre> | ||
.---------------- [m]inute: minuto (0 - 59) | .---------------- [m]inute: minuto (0 - 59) | ||
Riga 88: | Riga 83: | ||
| | .---------- [d]ay [o]f [m]onth: giorno del mese (1 - 31) | | | .---------- [d]ay [o]f [m]onth: giorno del mese (1 - 31) | ||
| | | .------- [mon]th: mese (1 - 12) OPPURE jan,feb,mar,apr... | | | | .------- [mon]th: mese (1 - 12) OPPURE jan,feb,mar,apr... | ||
| | | | .---- [d]ay [o]f [w]eek: giorno della settimana (0 - | | | | | .---- [d]ay [o]f [w]eek: giorno della settimana (0 - 7) (la domenica vale 0 o 7) OPPURE sun,mon,tue,wed,thu,fri,sat | ||
| | | | | | | | | | | | ||
Riga 95: | Riga 90: | ||
== Sintassi == | == Sintassi == | ||
Ogni file | Ogni file crontab specifica su ogni riga un compito da assegnare al demone Cron.<br/> | ||
Una riga può contenere dei commenti (la riga inizia con il carattere "#") ed essere posizionata in qualunque punto del file. Non è possibile inserire un commento alla fine di una riga che già contiene un comando. <br/> | Una riga può contenere dei commenti (la riga inizia con il carattere "#") ed essere posizionata in qualunque punto del file. Non è possibile inserire un commento alla fine di una riga che già contiene un comando. <br/> | ||
Le righe contenenti i command settings sono costituite da campi separati da spazi o caratteri di tabulazione.<br/> | Le righe contenenti i command settings sono costituite da campi separati da spazi o caratteri di tabulazione.<br/> | ||
I primi cinque campi possono contenere un numero, un intervallo di valori, stringhe particolari o un asterisco (*). Quest'ultimo sta a indicare ogni possibile valore ammesso dell'intervallo; quindi un asterisco nel terzo campo indica che il comando verrà eseguito ogni giorno.<br/> | I primi cinque campi possono contenere un numero, un intervallo di valori, stringhe particolari o un asterisco (*). Quest'ultimo sta a indicare ogni possibile valore ammesso dell'intervallo; quindi un asterisco nel terzo campo indica che il comando verrà eseguito ogni giorno.<br/> | ||
Se tutti i primi cinque campi contengono un asterisco, il comando verrà eseguito | Se tutti i primi cinque campi contengono un asterisco, il comando verrà eseguito ogni minuto.<br/> | ||
Questo è un semplice esempio di | Questo è un semplice esempio di crontab editabile attraverso il comando <code>crontab -e</code> : | ||
<pre> | <pre> | ||
00 3 1 7 * /comando/da/eseguire | 00 3 1 7 * /comando/da/eseguire | ||
Riga 109: | Riga 104: | ||
; <code>'''Campo 3'''</code>: quando il giorno del mese vale 1. | ; <code>'''Campo 3'''</code>: quando il giorno del mese vale 1. | ||
; <code>'''Campo 4'''</code>: quando il mese è il settimo dell'anno ossia luglio. | ; <code>'''Campo 4'''</code>: quando il mese è il settimo dell'anno ossia luglio. | ||
; <code>'''Campo 5'''</code>: ogni giorno della settimana. Poiché è specificato il giorno del mese, questo campo viene ignorato (vale anche il caso opposto; più avanti sarà spiegato in che modo Cron interpreta le righe di | ; <code>'''Campo 5'''</code>: ogni giorno della settimana. Poiché è specificato il giorno del mese, questo campo viene ignorato (vale anche il caso opposto; più avanti sarà spiegato in che modo Cron interpreta le righe di un file crontab in cui sono specificati sia il giorno del mese che quello della settimana).<br/> | ||
Quindi, in breve, il comando è eseguito il primo luglio alle ore 3,00. | Quindi, in breve, il comando è eseguito il primo luglio alle ore 3,00. | ||
Riga 120: | Riga 115: | ||
*Esempio 2 | *Esempio 2 | ||
<pre> | |||
*/10 * * * * /comando/da/eseguire | |||
</pre> | |||
il comando verrà eseguito ogni 10 minuti, quando i minuti sono 00, 10, 20, 30, 40 e 50. | |||
*Esempio 3 | |||
<pre> | <pre> | ||
30 * 1-7 * * /comando/da/eseguire | 30 * 1-7 * * /comando/da/eseguire | ||
Riga 125: | Riga 126: | ||
il comando verrà eseguito i primi sette giorni di ogni mese, ad ogni ora e quando i minuti valgono 30. | il comando verrà eseguito i primi sette giorni di ogni mese, ad ogni ora e quando i minuti valgono 30. | ||
*Esempio | *Esempio 4 | ||
<pre> | <pre> | ||
00 */2 15 * * /comando/da/eseguire | 00 */2 15 * * /comando/da/eseguire | ||
Riga 131: | Riga 132: | ||
il comando verrà eseguito il quindicesimo giorno di ogni mese, ogni due ore. | il comando verrà eseguito il quindicesimo giorno di ogni mese, ogni due ore. | ||
*Esempio | *Esempio 5 | ||
<pre> | <pre> | ||
00 1-9/2 1 5 * /comando/da/eseguire | 00 1-9/2 1 5 * /comando/da/eseguire | ||
Riga 137: | Riga 138: | ||
il comando viene eseguito il primo maggio alle 1,00 - 3,00 - 5,00 - 7,00 - 9,00. Cioè ogni due ore dalle 1,00 alle 9,00. | il comando viene eseguito il primo maggio alle 1,00 - 3,00 - 5,00 - 7,00 - 9,00. Cioè ogni due ore dalle 1,00 alle 9,00. | ||
*Esempio | *Esempio 6 | ||
<pre> | <pre> | ||
00 1-10/2 1 5 * /comando/da/eseguire | 00 1-10/2 1 5 * /comando/da/eseguire | ||
Riga 143: | Riga 144: | ||
il comando viene eseguito il primo maggio alle 1,00 - 3,00 - 5,00 - 7,00 - 9,00. Cioè ogni due ore dalle 1,00 alle 10,00. Si noti come l'ultimo valore utile dell'intervallo non coincida, in questo caso, con l'ora in cui viene fatta partire l'ultima esecuzione giornaliera del comando. | il comando viene eseguito il primo maggio alle 1,00 - 3,00 - 5,00 - 7,00 - 9,00. Cioè ogni due ore dalle 1,00 alle 10,00. Si noti come l'ultimo valore utile dell'intervallo non coincida, in questo caso, con l'ora in cui viene fatta partire l'ultima esecuzione giornaliera del comando. | ||
*Esempio | *Esempio 7 | ||
<pre> | <pre> | ||
00 13 2,8,14 * * /comando/da/eseguire | 00 13 2,8,14 * * /comando/da/eseguire | ||
Riga 149: | Riga 150: | ||
il comando verrà eseguito il secondo, l'ottavo e il quattordicesimo giorno di ogni mese alle 13.00 | il comando verrà eseguito il secondo, l'ottavo e il quattordicesimo giorno di ogni mese alle 13.00 | ||
*Esempio | *Esempio 8 | ||
<pre> | <pre> | ||
30 13 1-15 4,10 * /comando/da/eseguire | 30 13 1-15 4,10 * /comando/da/eseguire | ||
Riga 155: | Riga 156: | ||
il comando verrà eseguito i primi quindici giorni di aprile e ottobre alle 13,30. | il comando verrà eseguito i primi quindici giorni di aprile e ottobre alle 13,30. | ||
*Esempio | *Esempio 9 | ||
<pre> | <pre> | ||
*/30 13,20 * 1-7,9-12 1-5 /comando/da/eseguire | */30 13,20 * 1-7,9-12 1-5 /comando/da/eseguire | ||
Riga 161: | Riga 162: | ||
il comando verrà eseguito nei giorni feriali (da lunedì a venerdì) di tutti i mesi tranne agosto, alle 13,00 - 13,30 - 20,00 - 20,30. | il comando verrà eseguito nei giorni feriali (da lunedì a venerdì) di tutti i mesi tranne agosto, alle 13,00 - 13,30 - 20,00 - 20,30. | ||
*Esempio | *Esempio 10 | ||
<pre> | <pre> | ||
00 14,19 1-15 * 5 /comando/da/eseguire | 00 14,19 1-15 * 5 /comando/da/eseguire | ||
Riga 168: | Riga 169: | ||
'''Attenzione.'''<br/> | '''Attenzione.'''<br/> | ||
Poiché i giorni possono essere specificati sia nel terzo che nel quinto campo e nel caso in cui questi due campi abbiano entrambi un valore diverso dall'asterisco, il demone Cron lancia il comando quando i campi corrispondono alla data corrente e in maniera indipendente l'uno dall'altro. In questo caso, dunque, verrà eseguito il comando sia negli specificati giorni del mese sia nei giorni specificati della settimana.<br/> | Poiché i giorni possono essere specificati sia nel terzo che nel quinto campo e nel caso in cui questi due campi abbiano entrambi un valore diverso dall'asterisco, il demone Cron lancia il comando quando i campi corrispondono alla data corrente e in maniera indipendente l'uno dall'altro. In questo caso, dunque, verrà eseguito il comando sia negli specificati giorni del mese sia nei giorni specificati della settimana.<br/> | ||
Quindi l'esempio precedente non porta al risultato di lanciare il comando solo nei primi quindici giorni di ogni mese quando il giorno è venerdì, ma al risultato di lanciare il comando nei primi quindici giorni di ciascun mese e ogni venerdì di ogni settimana dell'anno. | Quindi l'esempio precedente '''non''' porta al risultato di lanciare il comando solo nei primi quindici giorni di ogni mese quando il giorno è venerdì, ma al risultato di lanciare il comando nei primi quindici giorni di ciascun mese e anche ogni venerdì di ogni settimana dell'anno. | ||
Se si vuole ottenere il risultato di lanciare un comando in un particolare giorno della settimana solo se questo coincide con un giorno del mese o se appartiene a un intervallo di giorni del mese, bisogna eseguire un test separato sulla data. Il test può essere fatto sia all'interno di <code>crontab</code>, sia all'interno di uno script lanciato da <code>crontab</code>. | |||
* Esempio 10 | |||
Questo è un esempio che mostra come eseguire un comando solo alla mezzanotte della prima domenica di ogni mese: | |||
<pre> | |||
00 00 1-7 * * [ $(/bin/date '+\%u') -eq 7 ] && /comando/da/eseguire | |||
</pre> | |||
* Esempio 11 | |||
Quest'altro esempio mostra come eseguire un comando alle 20,00 nei giorni che vanno dal 5 al 10 di ogni mese e solo se questi giorni corrispondono a martedì o venerdì: | |||
<pre> | |||
00 20 5-10 * * [ $(/bin/date '+\%u') -eq 2 -o $(/bin/date '+\%u') -eq 5 ] && /comando/da/eseguire | |||
</pre> | |||
''notare in entrambi i casi l'uso dell'escape del carattere '%'''.<br/> | |||
Consultare le manpages dei comandi '''date''' e '''test''' per ottenere informazioni sul loro funzionamento. | |||
===Stringhe speciali=== | === Stringhe speciali === | ||
Al posto dei primi cinque campi è possibile inserire particolari stringhe che il demone Cron interpreta come valori corretti per i campi data/ora. Vediamole: | Al posto dei primi cinque campi è possibile inserire particolari stringhe che il demone Cron interpreta come valori corretti per i campi data/ora. Vediamole: | ||
<pre> | <pre> | ||
Riga 182: | Riga 198: | ||
@daily Lancia il comando una volta al giorno. Uguale a "0 0 * * *" | @daily Lancia il comando una volta al giorno. Uguale a "0 0 * * *" | ||
@midnight (come @daily) | @midnight (come @daily) | ||
@hourly Lancia il comando una volta all'ora. Uguale a "0 * * * * | @hourly Lancia il comando una volta all'ora. Uguale a "0 * * * *" | ||
</pre> | </pre> | ||
in base a questa tabella sono perfettamente ammissibili le seguenti righe per il file | in base a questa tabella sono perfettamente ammissibili le seguenti righe per il file crontab: | ||
<pre> | <pre> | ||
@daily /comando/da/eseguire | @daily /comando/da/eseguire | ||
Riga 194: | Riga 210: | ||
con cui il comando verrà eseguito ogni mese; in particolare il primo giorno di ogni mese, a mezzanotte. | con cui il comando verrà eseguito ogni mese; in particolare il primo giorno di ogni mese, a mezzanotte. | ||
=== | === Messaggi di output === | ||
L'esecuzione di comandi o script può comportare l'invio allo standard output o allo standard error dei loro messaggi d'esecuzione.<br/> Normalmente tali messaggi vengono inviati allo schermo ma, nel caso vengano eseguiti tramite ''Cron'', l'output sarà reindirizzato attraverso l'[[MTA]] di sistema all'utente specificato tramite la variabile ''MAILTO''.<br/> | |||
Questo può portare all'invio di messaggi con output indesiderato, o perché totalmente non richiesto per un determinato cronjob o perché si desidera soltanto la notifica dei messaggi d'errore nel caso il comando abbia avuto problemi.<br/> | |||
Per operare su questo aspetto si può reindirizzare l'output del comando specificato in ''Cron'' come si farebbe normalmente per la shell. | |||
* Notifica solo dei messaggi d'errore. Si reindirizza lo standard output verso "/dev/null", ad esempio: | |||
: <pre>00 3 1 7 * /comando/da/eseguire > /dev/null</pre> | |||
* Soppressione totale dei messaggi. Si reindirizza sia lo standard output che lo standard error verso "/dev/null", ad esempio: | |||
: <pre>00 3 1 7 * /comando/da/eseguire > /dev/null 2>&1</pre>Si noti che, in questo caso, l'impostazione:<pre>MAILTO = ""</pre> | |||
: avrebbe effetto su tutti i cronjob e non solo su quello voluto. | |||
* Utilizzo di un file di log personale | |||
: <pre>00 3 1 7 * /comando/da/eseguire >> /percorso/desiderato/mio_file.log 2>&1</pre> | |||
=== Esempio di crontab === | |||
Di seguito un esempio di file crontab in cui sono specificate le variabili d'ambiente e i settaggi di comando: | |||
<pre> | <pre> | ||
# Crontab Environmental settings | # Crontab Environmental settings | ||
Riga 208: | Riga 236: | ||
15 20 * 1-7 * /comando/da/eseguire2 | 15 20 * 1-7 * /comando/da/eseguire2 | ||
*/30 7,21 1-15 1 * /comando/da/eseguire3 | */30 7,21 1-15 1 * /comando/da/eseguire3 | ||
@reboot /comando/da/eseguire4 | |||
</pre> | </pre> | ||
== Crontab di sistema == | == Crontab di sistema: /etc/crontab == | ||
Anche la nostra macchina ha il proprio file | Anche la nostra macchina ha il proprio file crontab in cui sono specificati i comandi di sistema da lanciare ad intervalli regolari. Il file è contenuto in <code>/etc/crontab</code> e le sue modifiche sono automaticamente intercettate da Cron.<br/> | ||
In questo file è utilizzato un campo aggiuntivo, dopo i primi cinque campi data/ora e prima del comando, che specifica l'utente con i cui permessi verrà eseguito il comando. | |||
Guardiamo i settaggi di comando al suo interno: | |||
<pre> | <pre> | ||
# m h dom mon dow user command | # m h dom mon dow user command | ||
Riga 229: | Riga 261: | ||
il comando <code>run-parts</code> lancia gli script presenti in <code>/etc/cron.monthly</code> il primo di ogni mese alle 6,52 | il comando <code>run-parts</code> lancia gli script presenti in <code>/etc/cron.monthly</code> il primo di ogni mese alle 6,52 | ||
In breve, il | In breve, il crontab di sistema indica a Cron di lanciare ad intervalli regolari gli script di sistema contenuti nelle cartelle sopra indicate.<br/> | ||
Tipicamente questo file non necessita di essere editato, a meno che non ci si accorga che gli script non possono essere lanciati a causa dell'inattività della macchina alla data/ora specificata. Come si può ben notare, il comando <code>run-parts</code> viene lanciato con i permessi di root (sesto campo). | Tipicamente questo file non necessita di essere editato, a meno che non ci si accorga che gli script non possono essere lanciati a causa dell'inattività della macchina alla data/ora specificata. Come si può ben notare, il comando <code>run-parts</code> viene lanciato con i permessi di root (sesto campo). | ||
È importante sottolineare che, di default, nel file <code>/etc/crontab</code> è indicata un'ora durante la quale è molto probabile che una macchina desktop sia spenta e che, quindi, Cron sia impossibilitato ad eseguire gli script presenti nelle directory <code>/etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly .</code><br/> | |||
Poiché in queste directory sono contenuti script che <u>necessitano</u> di essere eseguiti in quanto permettono, tra le altre cose, la rotazione dei log e il backup di file importanti di sistema, è vivamente consigliato editare il file modificando le ore/minuti del cronjob in modo da essere sicuri che il sistema sia attivo all'ora specificata.<br/> | |||
Ad esempio: | |||
<pre> | |||
# m h dom mon dow user command | |||
21 * * * * root cd / && run-parts --report /etc/cron.hourly | |||
25 8 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) | |||
47 8 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) | |||
52 8 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) | |||
</pre> | |||
Se non si vuole editare il file <code>/etc/crontab</code> si può, più semplicemente, installare [[anacron]].<br/> | |||
Ovviamente per un server sempre acceso, e con Cron attivo e funzionante, non c'è bisogno di alcuna modifica né di installare anacron. | |||
== Le directory /etc/cron.*/ == | == Le directory /etc/cron.*/ == | ||
Riga 241: | Riga 286: | ||
La data/ora in cui vengono eseguiti gli script contenuti in queste directory è quella specificata nel file <code>/etc/crontab</code>. | La data/ora in cui vengono eseguiti gli script contenuti in queste directory è quella specificata nel file <code>/etc/crontab</code>. | ||
*<code>'''/etc/cron.d/'''</code>: in questa directory sono vi sono script ma file nel formato di <code>crontab</code>. Qui il sistema specifica i lavori da passare a Cron per intervalli temporali diversi dall'ora o dal giorno o dal mese o dalla settimana.<br/> | *<code>'''/etc/cron.d/'''</code>: in questa directory sono vi sono script ma file nel formato di <code>crontab</code>. Qui il sistema specifica i lavori da passare a Cron per intervalli temporali diversi dall'ora o dal giorno o dal mese o dalla settimana.<br/>Le righe presenti nei file contenuti in quest'ultima directory devono seguire il seguente schema:<pre>* * * * * utente comando</pre>Le modifiche ai file di questa directory vengono automaticamente intercettate da Cron e, come per il file <code>/etc/crontab</code>, anche per i file contenuti in questa directory viene specificato l'utente con i cui permessi deve essere eseguito il comando.<br/> Anacron non esegue i cronjob contenuti in questa directory. | ||
Le righe presenti nei file contenuti in quest'ultima directory devono seguire il seguente schema: | |||
<pre> | |||
* * * * * utente comando | |||
</pre> | |||
Tutte queste cinque directory, per una questione di pulizia del sistema, non dovrebbero essere utilizzate per inserirvi script da parte degli utenti, anche se nulla vieta di farlo. Le controindicazioni sono quelle di "dimenticarsi" qualche script o di lanciare, coi permessi di root, qualche comando che necessiterebbe solo dei semplici permessi utente.<br/> | Tutte queste cinque directory, per una questione di pulizia del sistema, non dovrebbero essere utilizzate per inserirvi script da parte degli utenti, anche se nulla vieta di farlo. Le controindicazioni sono quelle di "dimenticarsi" qualche script o di lanciare, coi permessi di root, qualche comando che necessiterebbe solo dei semplici permessi utente.<br/> | ||
Se non si hanno esigenze particolari, la strada per assegnare dei lavori a Cron è sempre quella di avvalersi del comando: | Se non si hanno esigenze particolari, la strada per assegnare dei lavori a Cron è sempre quella di avvalersi del comando: | ||
<pre> | <pre> | ||
crontab -e | |||
</pre> | </pre> | ||
sia per root che per un normale utente. | sia per root che per un normale utente. | ||
== Esportare un file crontab == | == Esportare un file crontab == | ||
Se si vuole salvare il proprio | Se si vuole salvare il proprio crontab per esportarlo su un'altra macchina o semplicemente per farne una copia di backup, la procedura è semplicissima: | ||
<pre>$ crontab -l > mycrontab </pre> | <pre>$ crontab -l > mycrontab </pre> | ||
in questo modo il file <code>crontab</code> verrà salvato nel file <code>mycrontab</code>.<br/> | in questo modo il file <code>crontab</code> verrà salvato nel file <code>mycrontab</code>.<br/> | ||
Per salvare il | Per salvare il crontab di root è sufficiente lanciare lo stesso comando con i permessi di root.<br/> | ||
Se si vuole salvare il | Se si vuole salvare il crontab di un altro utente, eseguire con i permessi di root: | ||
<pre># crontab -u utente -l > usercrontab </pre> | <pre># crontab -u utente -l > usercrontab </pre> | ||
I nomi scelti per i file sono puramente indicativi. | I nomi scelti per i file sono puramente indicativi. | ||
== Importare un file crontab == | == Importare un file crontab == | ||
Questa procedura è utile per importare un file in cui si è precedentemente salvato il contenuto di un file | Questa procedura è utile per importare un file in cui si è precedentemente salvato il contenuto di un file crontab oppure per importare un file editato a mano attraverso un qualsiasi altro editor, testuale o grafico: | ||
<pre>$ crontab mycrontab</pre> | <pre>$ crontab mycrontab</pre> | ||
in questo modo il contenuto di <code>mycrontab</code> verrà inserito nel | in questo modo il contenuto di <code>mycrontab</code> verrà inserito nel crontab dell'utente che lancia il comando.<br/> | ||
Per un diverso utente, eseguire da root: | Per un diverso utente, eseguire da root: | ||
<pre># crontab -u utente usercrontab</pre> | <pre># crontab -u utente usercrontab</pre> | ||
Anche in questo caso i nomi dei file sono puramente indicativi.<br/> | Anche in questo caso i nomi dei file sono puramente indicativi.<br/> | ||
'''Attenzione''': i file <code>crontab</code>, se | '''Attenzione''': il file crontab, se presente, verrà sovrascritto! | ||
== Logging == | |||
;File di log:Nel caso si abbiano problemi nel far funzionare correttamente il servizio di scheduling, si può in qualsiasi momento dare un'occhiata al file di log <code>/var/log/syslog</code> in cui il demone Cron invia i propri messaggi di sistema.<br/>Alternativamente è possibile avere un file di log separato per contenere i messaggi di Cron.<br/>Basta decommentare la riga del file <code>/etc/rsyslog.conf</code> :<pre>cron.* /var/log/cron.log</pre>e riavviare "rsyslog":<pre># service rsyslog restart</pre>per avere tutti i messaggi in <code>/var/log/cron.log</code> . | |||
;Log level:Il livello di logging (cioè le informazioni che vengono scritte nei log prodotti da ''Cron'') può essere impostato nel file <code>/etc/default/cron</code> agendo sulla direttiva "EXTRA_OPTS". Ad esempio:<pre>EXTRA_OPTS="-L 8"</pre>I valori possibili sono:<pre>0 nessun log a meno che non avvenga un errore 1 avvio del cronjob 2 fine del cronjob 4 log del cronjob con stato d'uscita diverso da 0 8 log anche dei processi-figlio del processo eseguito da Cron </pre>I valori possono essere sommati se si vuol loggare più di un evento.<br/>Con:<pre>EXTRA_OPTS="-L 15"</pre>si ottiene la massima "verbosità" del log.<br/>Per rendere effettive queste modifiche, servirà riavviare ''Cron'':<pre># service cron restart</pre> | |||
== Strumenti grafici == | |||
Benché il comando <code>crontab</code> sia assoultamente sufficiente per gestire i lavori da assegnare a Cron, a volte può essere comodo avere a disposizione un'interfaccia grafica anziché utilizzare la riga di comado soprattutto quando si utilizza Cron per la prima volta.<br/> | |||
{{Warningbox | Fare un backup del propri cronjob. Questi strumenti sovrascrivono i file corrispondenti in <code>/var/spool/cron/crontabs</code> e quindi le informazioni qui contenute (ad esempio i commenti) potrebbero andare perse.}} | |||
{| class="wikitable" | |||
!Pacchetto | |||
!Ambiente grafico | |||
!Note | |||
|- | |||
|kde-config-cron || KDE || crea una voce in "Avvio e Spegnimento" all'interno delle impostazioni di KDE | |||
|} | |||
== Problemi comuni == | |||
;<u>Lo script viene eseguito normalmente ma non attraverso Cron</u>:Il problema può essere in larga parte dovuto a due fattori: lo script fa uso di una sintassi diversa da quella usata da dash (leggere a tal proposito il paragrafo relativo ai "Crontab Environmental settings" e, in particolare, l'uso della variabile SHELL) oppure lo script esegue comandi che non ricadono all'interno dei percorsi definiti dalla variabile PATH. In quest'ultimo caso si può far ricorso al comando "strace" (presente nel pacchetto omonimo):<pre>$ strace -f -e trace=execve ./nomescript</pre> che mostrerà il percorso dei comandi eseguiti dallo script. Modificare, se necessario, la variabile PATH affinché preveda percorsi diversi da <code>/usr/bin</code> o <code>/bin</code> . | |||
==Note== | ==Note== | ||
Il sistema non va indietro nel tempo a raccogliere i lavori di Cron, ma li esegue solo se la data e l'ora sono uguali alla voce nel file. Se il computer è spento quando dovrebbe essere eseguito un comando in Cron, quel comando non viene eseguito. | Il sistema non va indietro nel tempo a raccogliere i lavori di Cron, ma li esegue solo se la data e l'ora sono uguali alla voce nel file. Se il computer è spento quando dovrebbe essere eseguito un comando in Cron ed [[anacron]] non è installato, quel comando non viene eseguito. | ||
== | {{Autori | ||
|Autore = [[Utente:Ferdybassi|Ferdybassi]] | |||
|Verificata_da = | |||
: [[Utente:S3v|S3v]] | |||
: [[Utente:Ferdybassi|Ferdybassi]] (dopo l'estensione) | |||
: [[Utente:Stemby|Stemby]] | |||
: [[Utente:HAL 9000|HAL 9000]] 19:40, 31 mar 2015 (CEST) | |||
|Numero_revisori = 4 | |||
|Estesa_da = | |||
: [[Utente:S3v|S3v]] | |||
}} | |||
[[Categoria:Servizi di sistema]] | [[Categoria:Servizi di sistema]] |
contributi