Utilizzo del servizio di scheduling Cron: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 2: Riga 2:
==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, mensilmente.
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.


== Le basi ==
== Le basi ==
Cron può essere fatto partire da <code>rc</code> o da <code>rc.local</code> e ritorna immediatamente al prompt, sicché non c'è bisogno di lanciarlo in background. Cron ricerca il file <code>/etc/crontab</code> per le voci (le cosiddette "entry") di sistema e <code>/var/spool/cron/crontabs</code> per le voci relative agli utenti che si trovano nel file <code>/etc/passwd</code>. Tutte le voci ritrovate sono caricate in memoria.
Cron viene lanciato in background all'avvio del sistema dallo script <code>/etc/init.d/cron</code> a cui punta il link presente in <code>/etc/rc2.d/</code>, sicché non c'è bisogno di lanciarlo manualmente. Cron ricerca il file <code>/etc/crontab</code> per le voci (le cosiddette "entry") di sistema e <code>/var/spool/cron/crontabs</code> per le voci relative agli utenti che si trovano nel file <code>/etc/passwd</code>. Tutte le voci ritrovate sono caricate in memoria.
Tutto ciò viene ripetuto ogni minuto. Il demone Cron esegue diversi compiti:
Tutto ciò viene ripetuto ogni minuto. Il demone Cron esegue diversi compiti:
* ricerca le voci ed esegue i programmi che sono stati schedulati.
* ricerca le voci ed esegue i programmi che sono stati schedulati.
* determina se il modtime (vale a dire la data e l'ora dell'ultima modifica) nella directory di cron è cambiato
* determina se il modtime (vale a dire la data e l'ora dell'ultima modifica) nella directory di Cron è cambiato
* se il modtime nella directory cron è cambiato, cron ricerca tutti i file e ricarica i programmi che sono stati modificati.
* se il modtime nella directory cron è cambiato, Cron ricerca tutti i file e ricarica i programmi che sono stati modificati.
Poiché cron cerca le modifiche ogni minuto, non è necessario farlo ripartire quando sono stati effettuati dei cambiamenti nei file nella directory cron.
Poiché Cron cerca le modifiche ogni minuto, non è necessario farlo ripartire ogni volta che vengono effettuati dei cambiamenti tramite il comando <code>crontab</code>.


== Utilizzare crontab ==
== Utilizzare crontab ==
Il demone Cron legge il file <code>'''crontab'''</code>; ogni utente può avere la propria versione di questo file, orientata agli specifici compiti che si vogliono eseguire. I flag associati con le applicazioni crontab specificano quando aprire crontab per avere la lista o per rimuovere e modificare compiti.
Il demone Cron legge i file contenuti in <code>/var/spool/cron/crontabs/</code> relativi ai compiti (cronjobs) che ogni specifico utente vuole eseguire. È importante sapere che questi file non vanno modificati direttamente, 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 crontab è la seguente:
La sintassi per il programma <code>crontab</code> è la seguente:
<pre>
<pre>
crontab [-u user] file
crontab [-u user] file
Riga 23: Riga 23:
</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 state usando il vostro crontab personale. NOTA: Il comando switch user (<code>su</code>) può confondere il crontab, così se siete nello switch <code>su</code> assicuratevi di utilizzare l'opzione <code>-u</code>.
* <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 state usando il vostro <code>crontab</code> personale. 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 crontab 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 crontab di editare il file. Cron usa l'editor definito dalla variabile <code>EDITOR</code> o da <code>VISUAL</code><!--
* <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 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 <code>crontab</code> per cancellare o inserirvi i lavori da assegnare a Cron.'''
 
* <code>'''-r'''</code> : questa opzione rimuove il file <code>crontab</code> specificato. Se nessun file viene specificato, rimuove il file <code>crontab</code> dell'utente.
DA CONTROLLARE:
in Lenny queste due variabili sono vuote, e anche impostandole manualmente il risultato non cambia.
 
-->. Se nessuna di queste variabili è definita, parte in automatico l'editor "nano". L'editor salva il file in <code>/tmp</code>; quando si esce dall'editor, il file è immediatamente piazzato nella locazione corretta e viene aggiornato il campo data/ora.
* <code>'''-r'''</code> : questa opzione rimuove il file crontab specificato. Se nessun file viene specificato, rimuove il file crontab dell'utente.


==Voci in Crontab==
==Voci in Crontab==
Solo 2 tipi di voci sono permesse nel crontab: i settaggi ambientali (Crontab Environmental settings) e i settaggi di comando (Crontab Command settings)
Solo due tipi di voci sono permesse nel <code>crontab</code>: 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>
Cron conosce già le diverse variabili ambientali. Per esempio, SHELL è settato a <code>/bin/bash</code>.<br/>
che, per motivi di leggibilità, dovrebbero essere inseriti in testa al file generato da <code>crontab</code>.<br/>
Altre variabili ambientali, come LOGNAME e HOME, sono associate al possessore del file. SHELL e HOME posso essere sovrascritte nello script, mentre non è possibile farlo con LOGNAME. Se MAILTO è definito (e non è settato a " "), tale variabile è inserita in una riga nel file crontab, e spedisce ogni messaggio generato all'utente specificato in questo campo.
Le variabili a cui è possibile assegnare un valore sono:
La seguente riga mostra MAILTO settato ad uno specifico utente (luca):
* <code>'''SHELL'''</code>: se non assegnata viene settata automaticamente da Cron a <code>/bin/sh</code> .
* <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 solo 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>'''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>crontab</code> all'utente che ne è proprietario.
#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 non è specificata, verrà inviata un'email all'utente a cui appartiene il <code>crontab</code>.<br/>
La seguente riga mostra la variabile MAILTO settata ad uno specifico utente (luca):
<pre>
<pre>
# spedisce tutti gli output all'utente *luca*
# spedisce tutti gli output all'utente *luca*
MAILTO=luca
MAILTO=luca
</pre>
</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 comandi usano un formato standard: ogni riga inizia con cinque campi ora/data. Se è il crontab di sistema, il campo successivo è lo username associato con la voce. Il campo seguente sarà il comando da eseguire. Il comando verrà eseguito solo quando la data e l'ora corrente coincideranno con tutti i valori dei campi time/date del crontab.
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 <code>crontab</code> 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.
 
I campi disponibili per la data e l'ora sono i seguenti:
I campi disponibili per la data e l'ora sono i seguenti:
<pre>
<pre>
Riga 59: Riga 71:
giorno della settimana | 0-7 (0 & 7 indicano la domenica)
giorno della settimana | 0-7 (0 & 7 indicano la domenica)
</pre>
</pre>
Questi campi possono anche contenere un asterisco (*) invece di un numero. Un asterisco indica che ogni possibile valore è ammesso.


Ecco lo schema:
Ecco lo schema per una generica linea presente in un file <code>crontab</code>:
<pre>
<pre>
.---------------- [m]inute: minuto (0 - 59)  
.---------------- [m]inute: minuto (0 - 59)  
Riga 70: Riga 81:
|  |  |  |  |
|  |  |  |  |


*  *  *  *  *  commando da eseguire
*  *  *  *  *  comando da eseguire
</pre>
 
== Sintassi ==
Ogni file <code>crontab</code> 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/>
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/>
Se tutti i primi cinque campi contengono un asterisco, il comando verrà eseguito ogni volta che il demone Cron legge i file <code>crontab</code>, cioè ogni minuto.<br/>
Questo è un semplice esempio di <code>crontab</code> editabile attraverso il comando <code>crontab -e</code> :
<pre>
00 3 1 7 * /comando/da/eseguire
</pre>
tenendo conto di quest'esempio, il comando verrà eseguito:
; <code>'''Campo 1'''</code>: quando i minuti sono 0.
; <code>'''Campo 2'''</code>: quando l'ora vale 3.
; <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 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>crontab</code> 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.
 
Naturalmente è possibile specificare intervalli di tempo, intervalli di date o combinazioni di questi:
*Esempio 1
<pre>
1-30 * * * * /comando/da/eseguire
</pre>
il comando verrà eseguito ogni giorno, ogni ora e quando i minuti vanno da 1 a 30.
 
*Esempio 2
<pre>
30 * 1-7 * * /comando/da/eseguire
</pre>
il comando verrà eseguito i primi sette giorni di ogni mese, ad ogni ora e quando i minuti valgono 30.
 
*Esempio 3
<pre>
00 */2 15 * * /comando/da/eseguire
</pre>
il comando verrà eseguito il quindicesimo giorno di ogni mese, ogni due ore.
 
*Esempio 4
<pre>
00 1-9/2 1 5 * /comando/da/eseguire
</pre>
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 5
<pre>
00 1-10/2 1 5 * /comando/da/eseguire
</pre>
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 6
<pre>
00 13 2,8,14 * * /comando/da/eseguire
</pre>
il comando verrà eseguito il secondo, l'ottavo e il quattordicesimo giorno di ogni mese alle 13.00
 
*Esempio 7
<pre>
30 13 1-15 4,10 * /comando/da/eseguire
</pre>
il comando verrà eseguito i primi quindici giorni di aprile e ottobre alle 13,30.
 
*Esempio 8
<pre>
*/30 13,20 * 1-7,9-12 1-5 /comando/da/eseguire
</pre>
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 9
<pre>
00 14,19 1-15 * 5 /comando/da/eseguire
</pre>
il comando verrà eseguito alle 14,00 e alle 19,00 dei primi quindici giorni di ogni mese e anche ogni venerdì.<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/>
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.
 
===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:
<pre>
  stringa        significato
  ------        -------
  @reboot        Lancia il comando all'avvio del sistema
  @yearly        Lancia il comando una volta all'anno. Uguale a "0 0 1 1 *"
  @annually      (come @yearly)
  @monthly      Lancia il comando una volta al mese. Uguale a "0 0 1 * *"
  @weekly        Lancia il comando una volta alla settimana. Uguale a "0 0 * * 0"
  @daily        Lancia il comando una volta al giorno. Uguale a "0 0 * * *"
  @midnight      (come @daily)
  @hourly        Lancia il comando una volta all'ora. Uguale a "0 * * * *
</pre>
in base a questa tabella sono perfettamente ammissibili le seguenti righe per il file <code>crontab</code>:
<pre>
@daily /comando/da/eseguire
</pre>
con cui il comando verrà eseguito una volta al giorno; in particolare a mezzanotte di ogni giorno.
<pre>
@monthly /comando/da/eseguire
</pre>
</pre>
con cui il comando verrà eseguito ogni mese; in particolare il primo giorno di ogni mese, a mezzanotte.


===Esempio di Crontab===
=== Esempio di Crontab ===
Di seguito un esempio di file <code>crontab</code> in cui sono specificate le variabili d'ambiente e i settaggi di comando:
<pre>
<pre>
# Crontab Environmental settings
# Crontab Environmental settings
Riga 83: Riga 195:


# m h dom m dow command
# m h dom m dow command
00 * * * * /comando/da/eseguire
00 3 * 7 0 /comando/da/eseguire
15 20 * 1-7 * /comando/da/eseguire2
*/30 7,21 1-15 1 * /comando/da/eseguire3
</pre>
 
== Crontab di sistema ==
Anche la nostra macchina ha il proprio file <code>crontab</code> in cui sono specificati i comandi di sistema da lanciare ad intervalli regolari. Il file è contenuto in <code>/etc/crontab</code> e viene letto da Cron, come i file <code>crontab</code> degli utenti, ogni minuto. Guardiamo i settaggi di comando al suo interno:
<pre>
# m h dom mon dow user  command
21 *    * * *  root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *  root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7  root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
</pre>
Sono presenti quattro righe relative ad altrettanti compiti per Cron. Se sul nostro sistema non è installato <code>anacron</code>, il demone Cron eseguirà il comando <code>run-parts</code> che ha il compito di lanciare tutti gli script presenti nelle cartelle <code>/etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly .</code><br/>
; <code>'''Prima riga'''</code>:
il comando <code>run-parts</code> lancia gli script presenti in <code>/etc/cron.hourly</code> ogni ora e quando i minuti valgono 21
; <code>'''Seconda riga'''</code>:
il comando <code>run-parts</code> lancia gli script presenti in <code>/etc/cron.daily</code> alle 6,25 di ogni giorno.
; <code>'''Terza riga'''</code>:
il comando <code>run-parts</code> lancia gli script presenti in <code>/etc/cron.weekly</code> ogni domenica alle 6,47.
; <code>'''Quarta riga'''</code>:
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 <code>crontab</code> di sistema si occupa 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).
 
== Le directory /etc/cron.*/ ==
Per completezza d'informazione si tratterà brevemente delle directory viste nel paragrafo precedente in cui sono contenuti gli script di sistema, o forniti da applicazioni, che necessitano di essere eseguiti ad intervalli regolari.<br/>
*<code>'''/etc/cron.hourly'''</code>: in questa directory sono contenuti gli script da eseguire ogni ora;
*<code>'''/etc/cron.daily'''</code>: in questa directory sono contenuti gli script da eseguire ogni giorno;
*<code>'''/etc/cron.weekly'''</code>: in questa directory sono contenuti gli script da eseguire ogni settimana;
*<code>'''/etc/cron.monthly'''</code>: in questa directory sono contenuti gli script da eseguire ogni mese;
 
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/>
Le righe presenti nei file contenuti in quest'ultima directory devono seguire il seguente schema:
<pre>
* * * * * utente comando
</pre>
</pre>
Ogni comando, come si vede dal file di esempio, è rappresentato da una riga nel file crontab:
Questi file vengono letti da Cron ogni minuto.
 
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:
<pre>
<pre>
# m h dom m dow command
$ crontab -e
00 3 * * 0 /comando/da/eseguire
</pre>
</pre>
* Il primo valore rappresenta il minuto in cui eseguire il comando. Nel nostro caso il comando viene eseguito allo scoccare dell'ora (00)
sia per root che per un normale utente.
* Il secondo valore rappresenta l'ora del giorno in cui eseguire il comando (Le 3 di notte)
* Il terzo valore rappresenta i giorni del mese in cui eseguire il comando (L'asterisco * corrisponde a tutti i giorni del mese. ' possibile anche indicare una sequenza di giorni. Ad esempio il valore 1-15 indica che il comando sarà eseguito nei primi 15 giorni del mese)
* Il quarto valore indica il mese in cui eseguire il comando (L'asterisco * corrisponde a tutti i mesi. ' possibile anche indicare una sequenza di mesi. Ad esempio il valore 1-4 indica che il comando sarà eseguito nei primi 4 mesi di ogni anno)
* Il quinto valore indica il giorno della settimana in cui eseguire il comando (I valori 0 e 7 rappresentano la domenica, 1 il lunedì e così via)
* L'ultimo valore rappresenta il percorso del comando da eseguire, con le sue eventuali opzioni


==Note==
==Note==
Il sistema non va indietro nel tempo a raccogliere i lavori 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, quel comando non viene eseguito.
 
== Problemi ==
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.
 
==Credits==
==Credits==
Questa guida è basata sull'originale presente su: http://openskill.info/infobox.php?ID=237
Questa guida è basata sull'originale presente su: http://openskill.info/infobox.php?ID=237

Versione delle 00:06, 31 ago 2010

Debian-swirl.png Versioni Compatibili

ERRORE: valore non valido ( Tutte le versioni di Debian )! Vedi qui.

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.
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.

Le basi

Cron viene lanciato in background all'avvio del sistema dallo script /etc/init.d/cron a cui punta il link presente in /etc/rc2.d/, sicché non c'è bisogno di lanciarlo manualmente. Cron ricerca il file /etc/crontab per le voci (le cosiddette "entry") di sistema e /var/spool/cron/crontabs per le voci relative agli utenti che si trovano nel file /etc/passwd. Tutte le voci ritrovate sono caricate in memoria. Tutto ciò viene ripetuto ogni minuto. Il demone Cron esegue diversi compiti:

  • ricerca le voci ed esegue i programmi che sono stati schedulati.
  • determina se il modtime (vale a dire la data e l'ora dell'ultima modifica) nella directory di Cron è cambiato
  • se il modtime nella directory cron è cambiato, Cron ricerca tutti i file e ricarica i programmi che sono stati modificati.

Poiché Cron cerca le modifiche ogni minuto, non è necessario farlo ripartire ogni volta che vengono effettuati dei cambiamenti tramite il comando crontab.

Utilizzare crontab

Il demone Cron legge i file contenuti in /var/spool/cron/crontabs/ relativi ai compiti (cronjobs) che ogni specifico utente vuole eseguire. È importante sapere che questi file non vanno modificati direttamente, ma solo attraverso il comando crontab seguito dagli appropriati flag che specificano se lanciare crontab per avere la lista o per aggiungere, rimuovere e modificare compiti.

La sintassi per il programma crontab è la seguente:

crontab [-u user] file
crontab [-u user] -l -e -r

I parametri significano:

  • -u : questa opzione comunica al sistema il nome dell'utente che "possiede" il file. Se l'opzione -u è omessa, il sistema deduce per default che state usando il vostro crontab personale. NOTA: Il comando switch user (su) può confondere il crontab, così se siete nello switch su assicuratevi di utilizzare l'opzione -u.
  • -l : questa opzione dice a crontab di elencare i file nello standard output, cioè di visualizzare il file.
  • -e : questa opzione dice a crontab di editare il file. Cron usa l'editor definito dalle variabili EDITOR o VISUAL. Se nessuna di queste due variabili è definita, parte in automatico l'editor di default. L'editor salva il file in /tmp; quando si esce dall'editor, il file è immediatamente salvato in /var/spool/cron/crontabs 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.
  • -r : questa opzione rimuove il file crontab specificato. Se nessun file viene specificato, rimuove il file crontab dell'utente.

Voci in Crontab

Solo due tipi di voci sono permesse nel crontab: i settaggi ambientali (Crontab Environmental settings) e i settaggi di comando (Crontab Command settings)

Crontab Environmental settings

I settaggi ambientali utilizzano la seguente forma:

NOME = valore

che, per motivi di leggibilità, dovrebbero essere inseriti in testa al file generato da crontab.
Le variabili a cui è possibile assegnare un valore sono:

  • SHELL: se non assegnata viene settata automaticamente da Cron a /bin/sh .
  • PATH: anche questa variabile, se non le viene assegnato un valore, è settata automaticamente da Cron a /usr/bin:/bin . È utile cambiare questo valore solo se si vuole inserire un comando senza specificarne il path. Per i comandi in /usr/bin e /bin, presenti cioè nel path di default, non è necessario specificarne il path completo.
  • LOGNAME: contiene il login name dell'utente che esegue crontab. Non può essere cambiata.
  • HOME: contiene il path della home directory associata all'utente che esegue crontab.
  • MAILTO: di default Cron invia un'email con l'output dei comandi presenti nel crontab all'utente che ne è proprietario.
  1. se questa variabile è settata, il demone Cron invierà un'email, con l'output del/dei comando/comandi specificati in crontab, all'utente specificato. È possibile specificare più utenti separandoli con una virgola;
  2. se la variabile è settata a "", allora non verranno inviate email;
  3. se la variabile non è specificata, verrà inviata un'email all'utente a cui appartiene il crontab.

La seguente riga mostra la variabile MAILTO settata ad uno specifico utente (luca):

# spedisce tutti gli output all'utente *luca*
MAILTO=luca

mentre la successiva riga informa Cron di non inviare email:

# non viene inviata nessuna email
MAILTO=""

ovviamente, affinché Cron possa inviare con successo le email, bisogna avere un MTA installato e funzionante sulla propria macchina.

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 crontab di sistema (/etc/crontab) e per i lavori di Cron presenti in /etc/cron.d/, 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.
Vedremo in seguito che sono possibili alcune eccezioni a questa regola.

I campi disponibili per la data e l'ora sono i seguenti:

Campi | Valori ammessi
----------------
minuti | 0-59
ore | 0-23
giorno | 1-31
mese | 1-12
giorno della settimana | 0-7 (0 & 7 indicano la domenica)

Ecco lo schema per una generica linea presente in un file crontab:

.---------------- [m]inute: minuto (0 - 59) 
|  .------------- [h]our: ora (0 - 23)
|  |  .---------- [d]ay [o]f [m]onth: giorno del mese (1 - 31)
|  |  |  .------- [mon]th: mese (1 - 12) OPPURE jan,feb,mar,apr... 
|  |  |  |  .---- [d]ay [o]f [w]eek: giorno della settimana (0 - 6) (domenica=0 or 7)  OPPURE sun,mon,tue,wed,thu,fri,sat 
|  |  |  |  |

*  *  *  *  *  comando da eseguire

Sintassi

Ogni file crontab specifica su ogni riga un compito da assegnare al demone Cron.
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.
Le righe contenenti i command settings sono costituite da campi separati da spazi o caratteri di tabulazione.
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.
Se tutti i primi cinque campi contengono un asterisco, il comando verrà eseguito ogni volta che il demone Cron legge i file crontab, cioè ogni minuto.
Questo è un semplice esempio di crontab editabile attraverso il comando crontab -e :

00 3 1 7 * /comando/da/eseguire

tenendo conto di quest'esempio, il comando verrà eseguito:

Campo 1
quando i minuti sono 0.
Campo 2
quando l'ora vale 3.
Campo 3
quando il giorno del mese vale 1.
Campo 4
quando il mese è il settimo dell'anno ossia luglio.
Campo 5
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 crontab in cui sono specificati sia il giorno del mese che quello della settimana).

Quindi, in breve, il comando è eseguito il primo luglio alle ore 3,00.

Naturalmente è possibile specificare intervalli di tempo, intervalli di date o combinazioni di questi:

  • Esempio 1
1-30 * * * * /comando/da/eseguire

il comando verrà eseguito ogni giorno, ogni ora e quando i minuti vanno da 1 a 30.

  • Esempio 2
30 * 1-7 * * /comando/da/eseguire

il comando verrà eseguito i primi sette giorni di ogni mese, ad ogni ora e quando i minuti valgono 30.

  • Esempio 3
00 */2 15 * * /comando/da/eseguire

il comando verrà eseguito il quindicesimo giorno di ogni mese, ogni due ore.

  • Esempio 4
00 1-9/2 1 5 * /comando/da/eseguire

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 5
00 1-10/2 1 5 * /comando/da/eseguire

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 6
00 13 2,8,14 * * /comando/da/eseguire

il comando verrà eseguito il secondo, l'ottavo e il quattordicesimo giorno di ogni mese alle 13.00

  • Esempio 7
30 13 1-15 4,10 * /comando/da/eseguire

il comando verrà eseguito i primi quindici giorni di aprile e ottobre alle 13,30.

  • Esempio 8
*/30 13,20 * 1-7,9-12 1-5 /comando/da/eseguire

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 9
00 14,19 1-15 * 5 /comando/da/eseguire

il comando verrà eseguito alle 14,00 e alle 19,00 dei primi quindici giorni di ogni mese e anche ogni venerdì.
Attenzione.
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.
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.

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:

   stringa        significato
   ------         -------
   @reboot        Lancia il comando all'avvio del sistema
   @yearly        Lancia il comando una volta all'anno. Uguale a "0 0 1 1 *"
   @annually      (come @yearly)
   @monthly       Lancia il comando una volta al mese. Uguale a "0 0 1 * *"
   @weekly        Lancia il comando una volta alla settimana. Uguale a "0 0 * * 0"
   @daily         Lancia il comando una volta al giorno. Uguale a "0 0 * * *"
   @midnight      (come @daily)
   @hourly        Lancia il comando una volta all'ora. Uguale a "0 * * * *

in base a questa tabella sono perfettamente ammissibili le seguenti righe per il file crontab:

@daily /comando/da/eseguire

con cui il comando verrà eseguito una volta al giorno; in particolare a mezzanotte di ogni giorno.

@monthly /comando/da/eseguire

con cui il comando verrà eseguito ogni mese; in particolare il primo giorno di ogni mese, a mezzanotte.

Esempio di Crontab

Di seguito un esempio di file crontab in cui sono specificate le variabili d'ambiente e i settaggi di comando:

# Crontab Environmental settings
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# Crontab Command settings

# m h dom m dow command
00 3 * 7 0 /comando/da/eseguire
15 20 * 1-7 * /comando/da/eseguire2
*/30 7,21 1-15 1 * /comando/da/eseguire3

Crontab di sistema

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 /etc/crontab e viene letto da Cron, come i file crontab degli utenti, ogni minuto. Guardiamo i settaggi di comando al suo interno:

# m h dom mon dow user  command
21 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Sono presenti quattro righe relative ad altrettanti compiti per Cron. Se sul nostro sistema non è installato anacron, il demone Cron eseguirà il comando run-parts che ha il compito di lanciare tutti gli script presenti nelle cartelle /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly .

Prima riga

il comando run-parts lancia gli script presenti in /etc/cron.hourly ogni ora e quando i minuti valgono 21

Seconda riga

il comando run-parts lancia gli script presenti in /etc/cron.daily alle 6,25 di ogni giorno.

Terza riga

il comando run-parts lancia gli script presenti in /etc/cron.weekly ogni domenica alle 6,47.

Quarta riga

il comando run-parts lancia gli script presenti in /etc/cron.monthly il primo di ogni mese alle 6,52

In breve, il crontab di sistema si occupa di lanciare ad intervalli regolari gli script di sistema contenuti nelle cartelle sopra indicate.
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 run-parts viene lanciato con i permessi di root (sesto campo).

Le directory /etc/cron.*/

Per completezza d'informazione si tratterà brevemente delle directory viste nel paragrafo precedente in cui sono contenuti gli script di sistema, o forniti da applicazioni, che necessitano di essere eseguiti ad intervalli regolari.

  • /etc/cron.hourly: in questa directory sono contenuti gli script da eseguire ogni ora;
  • /etc/cron.daily: in questa directory sono contenuti gli script da eseguire ogni giorno;
  • /etc/cron.weekly: in questa directory sono contenuti gli script da eseguire ogni settimana;
  • /etc/cron.monthly: in questa directory sono contenuti gli script da eseguire ogni mese;

La data/ora in cui vengono eseguiti gli script contenuti in queste directory è quella specificata nel file /etc/crontab.

  • /etc/cron.d/: in questa directory sono vi sono script ma file nel formato di crontab. 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.

Le righe presenti nei file contenuti in quest'ultima directory devono seguire il seguente schema:

* * * * * utente comando

Questi file vengono letti da Cron ogni minuto.

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.
Se non si hanno esigenze particolari, la strada per assegnare dei lavori a Cron è sempre quella di avvalersi del comando:

$ crontab -e

sia per root che per un normale utente.

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.

Problemi

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 /var/log/syslog in cui il demone Cron invia i propri messaggi di sistema.

Credits

Questa guida è basata sull'originale presente su: http://openskill.info/infobox.php?ID=237

Ferdybassi