Utilizzo del servizio di scheduling Cron: differenze tra le versioni

+ Problemi comuni
(+ Problemi comuni)
Riga 5: Riga 5:


== Le basi ==
== Le basi ==
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. 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 in memoria.
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.


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.
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 esegue diversi compiti:
Il [[demone]] Cron esegue diversi compiti:
* Ogni minuto controlla se vi sono stati 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 in memoria;
* 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;
* 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 ogni minuto l'ora/data dei job contenuti in memoria con l'ora/data corrente per stabilire se il comando schedulato debba essere avviato oppure no;
* 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>.
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>.
Riga 40: 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==
==Voci in un file crontab==
Riga 51: Riga 51:
che, per motivi di leggibilità, dovrebbero essere inseriti in testa al file generato dal comando <code>crontab</code>.<br/>
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> .<br/>
* <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.
: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>
* <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>'''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 il comando <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 crontab all'utente che ne è proprietario.
* <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 crontab.<br/>
#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*&#10;MAILTO=luca</pre>mentre la successiva riga informa Cron di non inviare email:<pre># non viene inviata nessuna email &#10;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 ===
Riga 106: Riga 93:
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 ogni volta che il demone Cron legge i file crontab in memoria, cioè ogni minuto.<br/>
Se tutti i primi cinque campi contengono un asterisco, il comando verrà eseguito ogni minuto.<br/>
Questo è un semplice esempio di crontab editabile attraverso il comando <code>crontab -e</code> :
Questo è un semplice esempio di crontab editabile attraverso il comando <code>crontab -e</code> :
<pre>
<pre>
Riga 234: Riga 221:


== Crontab di sistema: /etc/crontab ==
== Crontab di sistema: /etc/crontab ==
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 viene letto da Cron ogni minuto.<br/>
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.
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.


Riga 283: Riga 270:
:Le righe presenti nei file contenuti in quest'ultima directory devono seguire il seguente schema:
:Le righe presenti nei file contenuti in quest'ultima directory devono seguire il seguente schema:
<pre>* * * * * utente comando</pre>
<pre>* * * * * utente comando</pre>
:Il contenuto della directory viene letto da Cron ogni minuto 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 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.


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/>
Riga 319: Riga 306:
</pre>
</pre>
per avere tutti i messaggi in <code>/var/log/cron.log</code> .
per avere tutti i messaggi in <code>/var/log/cron.log</code> .
== 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==
6 999

contributi