Guida a Cron per Gentoo Linux
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 né
/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 |
* * * * * /bin/false
35 1 4 * mon-wed /bin/false
25 22 2 3 * /bin/true
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
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
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!
I contenuti di questo documento sono rilasciati sotto la licenza Creative
Commons - Attribution / Share Alike.
|