Gentoo Logo

Guida a Cron per Gentoo Linux

Indice:

1.  Le basi di Cron

Cosa fa cron

Cron è un demone che esegue operazioni pianificate gestite tramite il comando crontab. Porta a termine questo compito attivandosi ogni minuto e controllando la presenza di operazioni da eseguire (cron-job) in tutti i crontab degli utenti.

Nota: crontab è sia il nome di una lista di cron-job (operazioni da eseguire) che il nome del comando necessario alla configurazione di tale lista.

Cron

In Portage ci sono alcune implementazioni di cron tra cui scegliere. Tutte presentano una interfaccia simile, vale a dire l'uso di crontab o di un comando simile. E' presente, inoltre, una utilità strettamente collegata a cron, Anacron; funziona in simbiosi con cron su sistemi che non sono in esecuzione continua.

Tutti i pacchetti cron richiedono come dipendenza sys-process/cronbase. Tecnicamente non è strettamente necessario, ma cronbase fornisce funzionalità utili alla maggior parte degli utenti.

Prima di analizzare il funzionamento di cron, è necessario scegliere quale variante tra quelle disponibili utilizzare. Segue, quindi, una breve descrizione per ognuna.

2.  Quale implementazione di cron utilizzare

Vixie cron

Vixie cron è una completa implementazione di cron basata su SysV cron. Ogni utente ha un proprio crontab ed è autorizzato a specificare proprie variabili d'ambiente al suo interno. Diversamente da altre varianti di cron, supporta SELinux e PAM. Supporta, però, meno architetture rispetto a Dcron, ma più di Fcron.

Caratteristiche di sys-process/vixie-cron:

  • Supporto per SELinux
  • Supporto per PAM /etc/security/limits.conf
  • Configurazione di variabili d'ambiente in crontab (PATH, SHELL, HOME, ecc.)
  • Ogni utente può avere un proprio crontab; l'accesso è controllato da cron.allow e cron.deny

Il Cron di Dillon

Dcron aspira ad essere la più semplice, elegante e sicura implementazione di cron. Non permette la configurazione delle variabili d'ambiente in crontab e tutti i cron-job sono eseguiti da /bin/sh. Come Vixie cron, ogni utente ha il proprio crontab.

Caratteristiche di sys-process/dcron:

  • Veloce, semplice e privo di funzioni inutili
  • L'accesso a crontab è limitato agli utenti del gruppo cron.

Fcron

Fcron mira a rimpiazzare Vixie cron e Anacron. E' progettato per funzionare su sistemi che non sono continuamente in esecuzione e si presenta con caratteristiche extra. Possiede un job startup constraint, un job serialization control, l'abilità di assegnare valori di nice (priorità) alle operazioni pianificate e l'abilità di pianificare operazioni da eseguire all'avvio del sistema. Per maggiori informazioni è possibile consultare la sua pagina ufficiale.

Caratteristiche di sys-process/fcron:

  • Progettato per funzionare su sistemi in esecuzione non continua; in pratica può eseguire operazioni dopo un riavvio nel caso la normale esecuzione pianificata fosse stata "mancata".
  • Configurazione di variabili d'ambiente e molte altre opzioni in crontab
  • Ogni utente può avere il proprio crontab, l'accesso è controllato da cron.allow e da cron.deny
  • Sintassi avanzata di crontab per il supporto di molte nuove caratteristiche

bcron

bcron è una nuova implementazione di cron, progettata sull'idea di operazioni sicure. A tale scopo, il sistema è suddiviso in diversi programmi, comunicanti tra loro attraverso canali rigorosamente controllati. Ogni programma è responsabile per una particolare operazione. L'interfaccia utente è analoga a quella di altri sistemi di questo tipo (come in vixie-cron), ma internamente differisce totalmente. Per maggiori informazioni, il sito internet di bcron è http://untroubled.org/bcron/.

Caratteristiche di sys-process/bcron:

  • Sostituzione intuitiva di vixie-cron
  • Progettazione multiprocesso
  • Supporto nativo dell'ora legale

Anacron

Anacron non è un demone cron, ma qualcosa che di solito funziona in simbiosi con esso. Esegue comandi a intervalli specificati in giorni e considera il sistema sul quale è eseguito in non continua esecuzione; eseguirà le operazioni pianificate "mancate" (se ad esempio il sistema è spento nel momento in cui un'operazione doveva essere eseguita). Anacron dipende dal demone cron.

3.  Uso di cron

Installazione

Scelta l'implementazione di cron ritenuta più adatta alle proprie esigenze, installarla con il comando emerge.

Codice 3.1: Installazione di cron

# emerge dcron
# /etc/init.d/dcron start
# rc-update add dcron default

A meno che non si abbia installato Fcron, si consiglia l'utilizzo anche di Anacron.

Codice 3.2: Installazione di anacron

# emerge anacron
# /etc/init.d/anacron start
# rc-update add anacron default

Crontab di Sistema

Terminata l'installazione, verrà chiesta l'esecuzione dell'istruzione crontab /etc/crontab. Il file /etc/crontab è il proprio crontab di sistema. Una installazione di cron può utilizzarlo insieme a sys-process/cronbase per eseguire gli script presenti in /etc/cron.{daily,hourly,weekly,monthly}. Notare che solo Vixie cron gestisce le operazioni in /etc/crontab in maniera automatica. Gli utilizzatori di Dcron e Fcron dovranno eseguire crontab /etc/crontab ogni qual volta vengano apportati dei cambiamenti a /etc/crontab.

Le operazioni pianificate nel crontab di sistema potrebbero non essere mostrate nella lista dei cron-job visualizzata tramite crontab -l.

Naturalmente è anche possibile non utilizzare nessun crontab di sistema. Se si è scelto uno fra Dcron e Fcron, non eseguire crontab /etc/crontab. Se si è scelto vixie-cron o bcron, si dovrebbero commentare tutte le linee presenti in /etc/crontab.

Codice 3.3: Commento (per l'esclusione) di tutte le linee presenti in /etc/crontab

# sed -i -e "s/^/#/" /etc/crontab

Dare l'accesso a cron ad altri utenti

Se si vuole che anche altri utenti al di fuori di root abbiano accesso al demone cron, la lettura di questa sezione è obbligatoria; in caso contrario la si può tranquillamente saltare seguendo invece la sezione Organizzazione dei cron-job.

Nota: Dando ad un altro utente l'accesso a crontab non gli si permetterà di eseguire cron-job come root. Se si vuole rendere un utente in grado di modificare il crontab di root, si deve utilizzare sudo. Leggere a proposito la Guida di Sudo(ers) per maggiori informazioni.

Se si vuole permettere ad un utente di utilizzare crontab, indipendentemente dall'implementazione di cron utilizzata, questo dovrà essere prima aggiunto al gruppo cron. Ad esempio, volendo aggiungere l'utente wepy al gruppo cron, bisogna digitare:

Codice 3.4: Aggiunta di un utente al gruppo cron

# gpasswd -a wepy cron

Nota: Dopo aver aggiunto un utente al gruppo cron, assicurarsi che tale utente effettui un logout e a seguire un nuovo login affinché l'aggiunta al gruppo sia effettiva.

E' tutto quello che bisogna fare per dare ad un utente l'accesso a crontab, se si sta utilizzando Dcron. Gli utilizzatori di Dcron possono passare alla lettura della sezione successiva Organizzazione dei cron-job, tutti gli altri dovranno continuare nella normale lettura.

Nel caso di utilizzo di Fcron, sarà necessario modificare /etc/fcron/fcron.deny e /etc/fcron/fcron.allow. Il metodo più sicuro è quello per prima cosa di negare l'accesso a tutti in /etc/fcron/fcron.deny e in seguito permettere l'accesso in maniera esplicita all'utente in /etc/fcron/fcron.allow.

Importante: Se né /etc/fcron/fcron.allow/etc/fcron/fcron.deny esistono, tutti gli utenti del gruppo cron saranno in grado di utilizzare crontab. Per fcron, il file di configurazione fcron.allow permette in modo predefinito l'accesso a fcrontab a tutti gli utenti del gruppo cron.

Codice 3.5: Permessi in fcron.deny

all

Ora, per ipotesi, avendo un utente wepy e volendo fosse in grado di gestire le proprie operazioni pianificate, esso andrebbe aggiunto a /etc/fcron/fcron.allow in questo modo:

Codice 3.6: Permessi in fcron.allow

wepy

Se è stato scelto Vixie cron, sarà solamente necessario modificare /etc/cron.allow.

Importante: E' importante notare che se esiste solamente /etc/cron.allow, allora solamente gli utenti del gruppo cron elencati al suo interno avranno accesso; se esiste un /etc/cron.deny anche vuoto, allora tutti gli utenti del gruppo cron saranno autorizzati! Non lasciare per questo vuoto /etc/cron.deny se non si ha nessun /etc/cron.allow.

Per esempio, se si vuole permettere l'accesso all'utente wepy, questo andrebbe aggiunto a /etc/cron.allow come mostrato:

Codice 3.7: Permessi in /etc/cron.allow

wepy

Organizzazione dei cron-job

Il processo di configurazione dei crontab è differente a seconda dell'implementazione di cron che si è scelta. Tutte, però, supportano gli stessi set di comandi di base: aggiunta e sostituzione dei crontab, modifica dei crontab, cancellazione dei crontab e visualizzazione dei cron-job in crontab. La lista seguente mostra come eseguire questi comandi per ogni implementazione.

Versione Modifica crontab Rimozione crontab Nuovo crontab Visualizzazione cron-job
dcron crontab -e crontab -d [user] crontab file crontab -l
fcron fcrontab -e fcrontab -r [user] fcrontab file fcrontab -l
vixie-cron & bcron crontab -e crontab -r [user] crontab file crontab -l

Nota: Se, nell'utilizzare il comando di rimozione crontab, non viene fornito nessun argomento, verrà eliminato il crontab dell'utente corrente.

Nota: Fcron ha anche un link simbolico da crontab a fcrontab.

Prima di utilizzare uno qualsiasi di questi comandi, è necessario sapere come è fatto crontab. Ogni linea in un crontab necessita di cinque campi nell'ordine seguente: i minuti (0-59), le ore (0-23), i giorni del mese (1-31), i mesi (1-12), e i giorni della settimana (0-7, Lunedì è 1, Domenica è 0 e 7). I giorni della settimana e i mesi possono essere inseriti anche tramite delle abbreviazioni inglesi di tre lettere come mon, tue, jan, feb, ecc. Ogni campo può anche contenere un campo di valori (ad esempio 1-5 per lun-ven), una lista di valori separati da virgole (ad esempio 1,2,3 o mon,tue,wed) oppure un campo di valori a salti (ad esempio 1-6/2 indica 1,3,5).

Tutto questo inizialmente può sembrare confusionario ma, con pochi esempi, risulterà molto semplice.

Codice 3.8: Esempi

# Esegue /bin/false ogni minuto
*     *     *     *     *        /bin/false

# Esegue /bin/false all'1:35 di mon,tue,wed (lun,mar,mer) e il 4 di ogni mese
35    1     4     *     mon-wed  /bin/false

# Esegue /bin/true alle 22:25 del 2 Marzo
25    22    2     3     *        /bin/true

# Esegue /bin/false alle 2:00 ogni Lunedì Mercoledì e Venerdì
0     2     *     *     1-5/2    /bin/false

Nota: Notare come si debba specificare giorni della settimana e giorni del mese prima di combinarli. Se si ha * per uno solo di questi, l'altro campo ha precedenza, mentre * per entrambi ha il significato di tutti i giorni.

Per provare tutto quello che si è imparato, saranno illustrati i passaggi per inserire alcuni cron-job. Prima di tutto creare un file chiamato crons.cron e modificarlo nel seguente modo:

Codice 3.9: Modifica di crons.cron

$ nano crons.cron
#Min   Ore     Giorni  Mesi    Giorno della settimana
10      3       1       1       *       /bin/echo "I don't really like cron"
30      16      *       1,2     *       /bin/echo "I like cron a little"
*       *       *       1-12/2  *       /bin/echo "I really like cron"

Ora si può aggiungere questo crontab al sistema con un "comando di aggiunta", come mostrato di seguito.

Codice 3.10: Un nuovo crontab

# crontab crons.cron

Nota: Non seguirà nessun output a questo comando a meno che non si utilizzi la ridirezione dell'output.

Per verificare le operazioni pianificate, si userà l'appropriato comando di visualizzazione dalla tabella precedentemente mostrata.

Codice 3.11: Visualizzazione dei cron-job

# crontab -l

Dovrebbe apparire una lista con il contenuto di crons.cron, in caso contrario si potrebbe avere utilizzato un comando errato per l'aggiunta del crontab.

Questo crontab dovrebbe mostrare sullo schermo un "I really like cron" ogni minuto di ogni ora di ogni giorno di ogni mese. Inoltre il crontab dovrebbe stampare un "I like cron a little" alle 16.30 per ogni giorno di Gennaio e di Febbraio. Per finire si dovrebbe anche vedere un "i don't really like cron" alle 3:10 del primo giorno di Gennaio.

Se si sta utilizzando Anacron, si dovrebbe continuare la lettura di questa sezione. In caso contrario, passare alla prossima modifica dei crontab.

Gli utilizzatori di Anacron dovranno modificare il file /etc/anacrontab. Questo file ha quattro campi: il numero di giorni tra ogni esecuzione, il ritardo in minuti dopo il quale eseguire l'operazione, il nome dell'operazione pianificata e il comando da eseguire.

Per esempio, per fare eseguire echo "i like anacron" ogni 5 giorni, 10 minuti dopo l'avvio di Anacron:

Codice 3.12: /etc/anacrontab

5 10 wasting-time /bin/echo "i like anacron"

Anacron termina dopo l'esecuzione di tutte le operazioni, così se si volesse che controlli queste operazioni ogni giorno, sarà necessario utilizzare cron. Le istruzioni alla fine della prossima sezione mostreranno come farlo.

Modifica dei crontab

Ovviamente, non è piacevole che il proprio sistema ripeta ("i really like cron") ogni minuto. Per questo, ora verrà rimossa questa voce del crontab con il corrispondente comando di rimozione. Verrà mostrata la lista dei cron-job successiva a questa operazione, per essere sicuri che tutto sia andato nel verso giusto.

Codice 3.13: Rimozione di un crontab

# crontab -d
# crontab -l

Non si dovrebbe vedere nessun cron-job nell'output da crontab -l. Se si dovessero vedere operazioni elencate, questo vorrà dire che i crontab non saranno stati rimossi, bisognerà controllare di avere usato il corretto comando di rimozione per la propria implementazione di cron.

Creato uno stato "pulito" di cron, si cercherà ora di inserire qualcosa di utile nel crontab di root. Molte persone vorrebbero eseguire updatedb settimanalmente per essere sicure del corretto funzionamento di mlocate. Per aggiungere questa operazione al crontab, bisogna per prima cosa modificare ancora crons.cron in modo simile a quanto di seguito riportato:

Codice 3.14: Un vero crontab

22 2 * * 1    /usr/bin/updatedb

Questo farà eseguire updatedb alle 2:22 A.M. di lunedì mattina ogni settimana. A questo punto immettere il crontab con il comando di nuova operazione dalla tabella e controllare nuovamente la lista.

Codice 3.15: Lista dei cron-job

# crontab crons.cron
# crontab -l

Ora, si vuole, ad esempio, inserire un emerge --sync alle operazioni automatiche giornaliere. Si potrebbe farlo modificando crons.cron e in seguito utilizzando crontab crons.cron proprio come prima oppure utilizzando l'apposito comando di modifica dalla tabella. Questo procedimento dà la possibilità di modificare il proprio crontab senza dipendere da file esterni quali ad esempio crons.cron.

Codice 3.16: Modifica di un crontab

# crontab -e

Questo dovrebbe aprire il crontab dell'utente con un editor. Se si vuole un emerge --sync giornaliero alle 6:30 del mattino, inserire qualcosa del genere:

Codice 3.17: Un vero crontab

22 2 * * 1    /usr/bin/updatedb
30 6 * * *    /usr/bin/emerge --sync
(se si sta utilizzando anacron, aggiungere questa linea)
30 7 * * *    /usr/sbin/anacron -s

Ora controllare la lista dei cron-job come fatto nell'esempio precedente per essere sicuri di avere inserito le operazione pianificate. Se vengono visualizzate, si sarà certi della correttezza delle operazioni effettuate.

4.  Utilizzo di cronbase

Come indicato precedentemente, tutte le implementazioni di cron hanno come dipendenza sys-process/cronbase. Il pacchetto cronbase crea /etc/cron.{hourly,daily,weekly,monthly}, e uno script chiamato run-crons. Come impostazione predefinita /etc/crontab contiene qualcoso del tipo:

Codice 4.1: Crontab predefinito di sistema

*/15 * * * *     test -x /usr/sbin/run-crons && /usr/sbin/run-crons
0  *  * * *      rm -f /var/spool/cron/lastrun/cron.hourly
0  3  * * *      rm -f /var/spool/cron/lastrun/cron.daily
15 4  * * 6      rm -f /var/spool/cron/lastrun/cron.weekly
30 5  1 * *      rm -f /var/spool/cron/lastrun/cron.monthly

Senza entrare troppo nei dettagli, questi comandi eseguiranno i propri script di ora, giorno, settimana e mese. Questa modalità di gestione dei cron-job ha alcuni importanti vantaggi:

  • Esecuzione dei comandi anche se il computer è spento nel momento in cui dovevano essere eseguiti.
  • Semplicità per i gestori dei pacchetti nel posizionamento di script in posti predefiniti.
  • Conoscenza esatta della localizzazione dei propri cron-job e del proprio crontab, al fine di facilitare operazioni di backup/restore di queste parti del sistema.

Nota: Ancora, è importante ricordare che vixie-cron e bcron leggono automaticamente /etc/crontab, al contrario di dcron e fcron. Leggere a tal proposito la sezione Crontab di Sistema.

5.  Note Finali

Problemi

Se si dovessero avere problemi nel far funzionare correttamente cron, questa sezione potrebbe essere d'aiuto.

  • Cron è in esecuzione? Eseguire ps ax | grep cron e assicurarsi che cron venga visualizzato!
  • Cron sta funzionando? Provare: * * * * * /bin/echo "foobar" >> /file_che_si_possiede e assicurarsi che funzioni
  • Il proprio comando funziona? Provare: * * * * * /bin/foobar > /file_che_si_possiede 2>&1, cercare gli errori in /file_che_si_possiede
  • Cron riesce ad eseguire le proprie operazioni? Controllare il log di cron, di solito /var/log/cron.log oppure /var/log/messages per gli errori
  • Ci sono dei file dead.letter? Di solito cron manda mail in presenza di un problema, controllare la propria posta oppure guardare in ~/dead.letter

Ricordarsi che ogni implementazione di cron è differente dalle altre e il campo delle caratteristiche/funzioni può variare di molto. Assicurarsi di controllare le pagine di manuale per crontab, fcrontab o anacrontab a seconda di quello che si sta utilizzando.

Buona fortuna!



Stampa

Aggiornato il 14 novembre 2010

La versione originale di questo documento non è più mantenuta

Oggetto: Questa guida tratta la configurazione e l'utilizzo di cron.

Eric Brown
Autore

Xavier Neys
Redazione

Joshua Saddler
Editor

Francesco Grieco
Traduzione

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.