Guida a Cron per Gentoo Linux

Contenuti:

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 almeno tre implementazioni differenti 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 utility strettamente collegata a cron, Anacron; funziona in simbiosi con cron su sistemi che non sono in continua esecuzione.

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, inoltre, 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 il 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

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, la si installi con il comando emerge.

Esempio 1: Installazione di cron

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

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

Esempio 2: Installazione di anacron

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

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 default di Gentoo utilizza questo file per eseguire gli script presenti in /etc/cron.{daily,hourly,weekly,monthly}. Si noti che 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 non saranno 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 si esegua crontab /etc/crontab. Se si è scelto Vixie cron, si dovrebbero commentare (per escludere) tutte le linee presenti in /etc/crontab.

Esempio 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 è obbigata; 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 editare il crontab di root, si deve utilizzare sudo.

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, se si vuole aggiungere l'utente wepy al gruppo cron, si dovrà digitare:

Esempio 4: Aggiunta di un utente al gruppo cron

# gpasswd -a wepy cron

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 Organizazzione dei cron-job, tutti gli altri dovranno continuare nella normale lettura.

Nel caso di utilizzo di Fcron, sarà necessario editare /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 di default, permette a tutti gli utenti del gruppo cron l'accesso a fcrontab.

Esempio 5: Permessi in fcron.deny

all

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

Esempio 6: Permessi in fcron.allow

wepy

Se si è scelto Vixie cron, sarà solamente necessario editare /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 si lasci 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:

Esempio 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 Comando di edit Comando di rimozione Comando di aggiunta Comando di visualizzazione
dcron crontab -e crontab -d crontab file crontab -l
fcron fcrontab -e fcrontab -r fcrontab file fcrontab -l
vixie-cron crontab -e crontab -r crontab file crontab -l

Nota: Fcron crea un link simbolico a crontab.

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.

Esempio 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: Si noti 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 si crei un file chiamato crons.cron e lo si editi come di seguito riportato:

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

Esempio 10: Un nuovo crontab

# crontab crons.cron

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

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

Esempio 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, si passi alla prossima modifica dei crontab.

Gli utilizzatori di Anacron dovranno editare 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:

Esempio 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 si vuole che il proprio sistema ripeta quanto vi piaccia cron ("i really like cron") ogni minuto. Per questo, ora si passerà alla rimozione del crontab con il corrispondente comando di rimozione. Mostreremo la lista dei cron-job successiva a questa operazione, per essere sicuri che tutto sia andato nel verso giusto.

Esempio 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 slocate. Per aggiungere questa operazione al crontab, bisogna per prima cosa editare ancora crons.cron in modo simile a quanto di seguito riportato:

Esempio 14: Un vero crontab

22 2 * * 1    /usr/bin/updatedb

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

Esempio 15: Lista dei cron-job

# crontab crons.cron
# crontab -l

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

Esempio 16: Edit 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, si dovrà inserire qualcosa del genere:

Esempio 17: Un vero crontab

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

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

4.Note Finali

Problemi 

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

  • Cron è in esecuzione?
    Esegui ps ax | grep cron, assicurati che cron sia mostrato!
  • Cron sta funzionando?
    Prova: * * * * * /bin/echo "foobar" >> /file_che_possiedi, e assicurati che funzioni
  • Il tuo comando funziona?
    Prova: * * * * * /bin/foobar > /file_che_possiedi 2>&1, cerca gli errori in /file_che_possiedi
  • Cron riesce ad eseguire le tue operazioni?
    Controlla il log di cron, di solito /var/log/cron.log oppure /var/log/messages per gli errori
  • Ci sono dead.letter?
    Di solito cron manda mail in presenza di un problema, controlla la tua posta oppure guarda in ~/dead.letter

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

Buona fortuna!



Ultimo aggiorn.:
2005-07-25
Eric Brown
Autore

Xavier Neys
Editor

Francesco Grieco
Traduzione

Sommario:  Questa guida tratta la configurazione e l'uso di cron.
- 2002 Gentoo.it - Domande, commenti e/o correzioni? Email gentoo-dev@gentoo.it.