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 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 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 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 |
* * * * * /bin/false
35 1 4 * mon-wed /bin/false
25 22 2 3 * /bin/true
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
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
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!
|