Cron
Questo articolo descrive come configurare ed utilizzare i demoni cron nel Linux Gentoo.
Basi di cron
Cosa fa cron
Cron è un demone che esegue le attività in base all'input dal comando crontab. Svolge questo compito attivandosi ogni minuto e controllando se ci sono lavori di cron da eseguire in una qualsiasi crontab dell'utente.
Notare che crontab è sia il nome di una lista di lavori cron che il nome del comando per modificare tale lista.
When using the systemd init system, (persistent) timers are available as a replacement of (ana)cron.
Il cron de facto
Ci sono varie possibili implementazioni cron tra cui scegliere su Portage. Offrono tutte un'interfaccia simile, ovvero l'uso di crontab o di un comando simile. C'è anche un'utilità correlata chiamata Anacron che è destinata a lavorare con cron nei sistemi che non sono in continuo funzionamento.
Tutti i pacchetti cron disponibili dipendono da sys-process/cronbase. Questo pacchetto non è tecnicamente dipendenza di ogni pacchetto cron, ma fornisce funzioni simili a cron che molti utenti possono apprezzare.
Prima di iniziare a lavorare con cron, deve essere selezionata un'implementazione corretta.
Qual è il cron giusto per lavorare?
Installare virtual/cron per ottenere l'implementazione cron predefinita di Gentoo.
cronie
Cronie (sys-process/cronie) è un fork di vixie-cron creato da Fedora. Essendo un fork, ha le stesse impostazioni tipiche fornite dall'originale vixie-cron. In aggiunta, cronie ha un'implementazione anacron che deve essere abilitata tramite la USE flag anacron
.
sys-process/cronie is a fork of the venerable vixie-cron, hosted at [1]. Because of it being a fork, it has the same feature set the original vixie-cron provides. Additionally, cronie comes with an anacron implementation which is enabled by default, through the anacron
USE flag. Be aware of the configuration differences as noted in bug #551352 when migrating from another cron system. Expected jobs may not run at all.
dcron (Dillon's Cron)
L'intento di Dcron è quello di essere un'implementazione di cron semplice, elegante e sicura. Essa non consente la specificazione delle variabili d'ambiente in crontabs e tutti i lavori di cron sono eseguiti da /bin/sh. Come vixie-cron, ogni utente ha il proprio crontab. A partire dalla versione 4, sono presenti le caratteristiche simili di anacron.
Caratteristiche di sys-process/dcron:
- Veloce, semplice e senza funzionalità inutili;
- L'accesso a crontab è limitato al gruppo cron, ovverosia non si basa su altre facoltà esterne.
fcron
Fcron mira a rimpiazzare vixie-cron e anacron. È progettato per funzionare in sistemi che non sono continuamente in esecuzione ed è equipaggiato di caratteristiche extra. Tra tali caratteristiche c'è quella di abilitare lavori di avvio forzati, lavori di controllo di serializzazione, l'abilità di assegnare buone utilità ai lavori e abilità di programmare i lavori da eseguire all'avvio del sistema. Per maggiori informazioni, consultare la home page di fcron.
Caratteristiche di sys-process/fcron:
- Progettato per funzionare in sistemi che non sono continuamente in esecuzione, per esempio può eseguire un lavoro dopo il riavvio se tale lavoro era stato perso;
- Variabili di impostazione di ambiente e molte altre opzioni in crontabs;
- Sintassi di crontab migliorata con supporto a molte nuove caratteristiche;
- Ogni utente può avere un crontab personale, l'accesso è controllato da cron.allow e da cron.deny
bcron
Bcron è un nuovo sistema cron, progettato avendo in mente operazioni di sicurezza. Per fare ciò, il sistema è diviso in svariati programmi separati, ognuno responsabile di un compito separato, con le comunicazioni tra di loro strettamente controllate. L'interfaccia utente è una copia di quella di sistemi simili (come vixie-cron), ma internamente differisce molto. Per maggiori informazioni, consultare la homepage di bcron.
Caratteristiche di sys-process/bcron:
- Rimpiazzo di vixie-cron;
- Desig multiprocesso;
- Supporto nativo dell'ora legale.
anacron
Anacron non è un demone cron ma è qualcosa che solitamente ci lavora in congiunzione. Esso esegue comandi a intervalli specificati in giorni e non presuppone che il sistema sia continuamente in funzione; esso eseguirà i lavori che erano stati persi mentre il sistema era spento. Anacron, solitamente, si basa su un demone cron per eseguirlo tutti i giorni.
Utilizzare cron
Installazione
Scegliere la giusta soluzione per il lavoro da svolgere e procedere con l'installazione:
root #
emerge --ask dcron
Controllare che il demone cron scelto sia stato aggiunto al processo di init del sistema; senza questo passo il demone cron non svolgerà il suo lavoro.
root #
/etc/init.d/dcron start
root #
rc-update add dcron default
Opzionalmente, se Fcron o dcron non sono stati installati, installare Anacron come helper per il demone cron potrebbe essere una scelta saggia.
root #
emerge --ask anacron
Di nuovo, non dimenticare di aggiungere anacron al processo di init del sistema.
root #
/etc/init.d/anacron start
root #
rc-update add anacron default
Per anacron, solitamente non esiste alcun processo di init. Piuttosto, anacron deve essere lanciato tramite un'implementazione diversa di cron.
Un metodo è avviare anacron tramite una definizione cron. Per impostazione predefinita, installa uno script di esecuzione oraria, che viene utilizzato dalla maggior parte delle implementazioni cron per impostazione predefinita. In caso contrario, è comunque possibile avviarlo tramite definizioni manuali:
# Avvia anacron ogni 10 minuti
*/10 * * * root /usr/sbin/anacron
# In alternativa, esegui lo script 0anacron fornito da anacron ogni ora
# 59 * * * * root /etc/cron.hourly/0anacron
Sistema crontab
Il messaggio post-installazione di qualcuno di questi pacchetti di cron richiede all'utente di eseguire crontab /etc/crontab. Il file /etc/crontab è il "system crontab". Una installazione cron può utilizzarlo in associazione con sys-process/cronbase per eseguire lo script in /etc/cron.{daily,hourly,weekly,monthly}. Notare che solo vixie-cron e cronie pianificano i lavori automaticamente in /etc/crontab. Gli utenti di dcron e di fcron dovranno eseguire crontab /etc/crontab ogni volta che apportano variazioni al file /etc/crontab.
Notare che i lavori pianificati nel sistema di crontab potrebbero non apparire nella lista dei lavori cron visualizzata tramite il comando crontab -l.
Ovviamente gli utenti possono scegliere di non utilizzare affatto nessun sistema crontab. Se viene optato per utilizzare dcron o fcron, non va eseguito crontab /etc/crontab. Se invece viene optato per utilizzare vixie-cron, cronie o bcron bisogna commentare tutte le righe in /etc/crontab.
Una via facile e veloce per commentare tutte le linee nel file è quella di utilizzare il comando sed. Eseguire il seguente comando per commentare tutte le righe in etc/crontab
root #
sed -i -e "s/^/#/" /etc/crontab
Dare i permessi di accesso a cron agli utenti
Per ottenere l'accesso al demone cron per gli utenti diversi da root, leggere questa sezione, altrimenti procedere alla prossima: Scheduling cron-jobs.
Dare accesso al crontab ad un altro utente non permette l'esecuzione dei cron-jobs come root. Per abilitare un utente a modificare il crontab di root bisogna utilizzare sudo (app-admin/sudo). Leggere la Gentoo Sudo(ers) Guida per maggiori dettagli.
Qualsiasi pacchetto cron sia stato scelto, per permettere ad un utente di utilizzare crontab bisogna prima aggiungerlo al gruppo cron. Ad esempio, per aggiungere l'utente "wepy" al gruppo cron, eseguire:
root #
gpasswd -a wepy cron
Quando si aggiunge un utente al gruppo cron, accertarsi che l'utente si scolleghi e si ricolleghi all'ambiente, affinchè l'aggiunta al gruppo abbia effetto.
dcron
Se si utilizza dcron, il passaggio di cui sopra necessita l'accesso a crontab da parte dell'utente. Gli utenti Dcron possono procedere alla prossima sezione Scheduling cron-jobs, tutti gli altri devono continuare con la lettura.
fcron
Se si utilizza fcron, modificare i files /etc/fcron/fcron.deny e /etc/fcron/fcron.allow. Il modo più sicuro per eseguire un sistema è, per prima cosa, negare tutti gli utenti in /etc/fcron/fcron.deny, e permettere solo gli utenti specificati su /etc/fcron/fcron.allow.
Se né /etc/fcron/fcron.allow né /etc/fcron/fcron.deny esistono, allora tutti gli utenti del gruppo cron saranno ammessi ad utilizzare crontab. fcron nasce con un fcron.allow di default il quale include tutti gli utenti ad accedere al gruppo cron di fcrontab.
all
Se un utente ("wepy" anche per questo esempio) deve essere in grado di pianificare i propri lavori cron, allora bisogna aggiungerlo su /etc/fcron/fcron.allow come segue:
wepy
cronie
Se si utilizzano vixie-cron o cronie, invece, editare semplicemente il file /etc/cron.allow.
E' importante notare che se esiste solo il file /etc/cron.allow, solo gli utenti elencati nel gruppo cron saranno abilitati. Altrimenti, se esiste il file /etc/cron.deny vuoto, tutti gli utenti del gruppo cron saranno abilitati. Non lasciare il file /etc/cron.deny vuoto se non esiste il file /etc/cron.allow!
Per esempio, per abilitare l'utente "wepy", aggiungerlo su /etc/cron.allow come segue:
wepy
Programmare i lavori cron
Il processo di modifica dei crontabs è differente per ogni pacchetto, ma tutti i pacchetti supportano le stesse impostazioni base dei comandi: aggiungere e sostituire crontabs, modificare crontabs, cancellare crontabs ed elencare i lavori cron in crontabs. La seguente lista mostra come eseguire i vari comandi per ogni pacchetto.
Versione | Modificare crontab | Rimuovere crontab | Nuovo crontab | Elencare i lavori cron |
---|---|---|---|---|
dcron | crontab -e | crontab -d [user] | crontab file | crontab -l |
fcron | fcrontab -e | fcrontab -r [user] | fcrontab file | fcrontab -l |
vixie-cron, cronie & bcron | crontab -e | crontab -r -u [user] | crontab file | crontab -l |
Quando si utilizza il comando per rimuovere crontab, se non viene aggiunto nessun argomento, vengono cancellati i correnti utenti di crontab.
Anche fcron ha un symlink da crontab a fcrontab.
Prima di utilizzare ognuno di questi comandi, è necessario comprendere crontab. Ogni riga in crontab specifica cinque campi nel seguente ordine: minuti (0-59), ore (0-23), giorni del mese (1-31), mesi (1-12) e giorni della settimana (0-7, lunedi è il giorno 1, domenica è il giorno 0 e il giorno 7). I giorni della settimana e i mesi possono essere specificati da un'abbreviazione di tre lettere, per esempio mon, tue, jan, feb, ecc.... Ogni campo può specificare anche un intervallo di valori (ad esempio 1-5 oppure mon-fri), una lista di valori separata da virgole (ad esempio 1,2,3 oppure mon,tue,wed) o un intervallo di valori a "step" (ad esempio 1-6/2 come 1,3,5 ovvero a intervallo di 2).
Questo può sembrare complesso, ma con qualche esempio sarà facile da capire, non è complicato.
# Run /bin/false every minute year round
* * * * * /bin/false
# Run /bin/false at 1:35 on the mon,tue,wed and the 4th of every month
35 1 4 * mon-wed /bin/false
# Run /bin/true at 22:25 on the 2nd of March
25 22 2 3 * /bin/true
# Run /bin/false at 2:00 every Monday, Wednesday and Friday
0 2 * * 1-5/2 /bin/false
Notare come impostare giorni specifici della settimana e giorni del mese prima di combinarli. Se * è utilizzato solamente per uno di essi, gli altri hanno la precedenza, mentre * per tutti significa ogni giorno.
Per verificare ciò che è stato appena impostato immettere qualche lavoro cron. Per prima cosa creare un file chiamato crons.cron come segue:
#Mins Hours Days Months Day of the week
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 aggiungere questo crontab al sistema con il "nuovo comando" della tabella di cui sopra.
root #
crontab crons.cron
L'output del comando echo non si vedrà se non si utilizza il reindirizzamento.
Per verificare i lavori cron programmati, utilizzare il corretto list command della tabella di cui sopra.
root #
crontab -l
Dovrebbe essere visualizzato un elenco simile a crons.cron; se questo non avviene, forse è stato utilizzato il comando sbagliato per inserire il crontab.
Questo crontab dovrebbe ripetere "I really like cron" ogni minuto di ogni ora di ogni giorno ogni due mesi. Ovviamente un utente fa questo solo se veramente gli piace cron. Il crontab ripeterà anche "I like cron a little" alle 16:30 di ogni giorno di gennaio e di febbraio. Ripeterà anche "I don't really like cron" alle 3:10 del primo gennaio.
Se si utilizza anacron continuare la lettura di questa sezione. Altrimenti procedere alla prossima sezione su Modificare crontabs.
Gli utenti anacron dovranno modificare /etc/anacrontab. Questo file ha quattro campi: il numero di giorni tra ogni esecuzione, il ritardo in minuti dopo il quale esso viene eseguito, il nome del lavoro e il comando da far eseguire.
Per esempio, per eseguire echo "I like anacron" ogni 5 giorni, 10 minuti dopo l'avvio di anacron, digitare come segue:
5 10 wasting-time /bin/echo "I like anacron"
Anacron viene chiuso dopo che tutti i lavori in anacrontab sono terminati. Per verificare se questi lavori devono essere eseguiti tutti i giorni bisogna utilizzare un demone cron. Come fare questo viene spiegato nelle istruzioni alla fine della prossima sezione.
Modificare crontabs
In realtà nessun utente vorrebbe sentirsi dire ogni minuto dal suo sistema quanto gli piace cron. Andando avanti, bisogna rimuovere l'esempio precedente di crontab utilizzando il corrispondente comando su rimuovere crontab dello schema di cui sopra. Utilizzare il corrispondente comando di elencazione per vedere i lavori cron, per essere sicuri che tutto funzioni.
root #
crontab -d
root #
crontab -l
Non dovrebbe essere elencato nessun lavoro cron nell'output di crontab -l. Se sono elencati lavori cron, invece, significa che il comando per rimuoverli non ha funzionato; verificare il corretto comando perrimuovere crontab relativo al pacchetto cron installato sul sistema.
Ora che abbiamo una situazione chiara, mettiamo qualcosa di utile nel crontab root. Molte persone eseguiranno updatedb su base mensile per assicurarsi che mlocate funzioni a dovere. Per aggiungere questo al crontab di sistema per prima cosa editare il file crons.cron come segue:
22 2 * * 1 /usr/bin/updatedb
Questo fa eseguire a cron l'updatedb alle ore 2:22 A.M. di lunedi mattina di ogni settimana. Ora inserire il crontab con il comando appropriato come da voce nuovo crontab nella tabella sopra, e verificare la lista dei lavori cron.
root #
crontab crons.cron
root #
crontab -l
Ora bisognerebbe lasciare eseguire emerge --sync giornalmente per mantenere aggiornato l'albero del Portage. Questo può essere fatto editando crons.cron ed utilizzando successivamente crontab crons.cron come è stato fatto nell'esempio sopra, oppure utilizzando il comando appropriato come mostrato nella tabella sopra alla voce modificare crontab. Questo provvede ad editare direttamente il crontab dell'utente senza dipendere da files esterni tipo crons.cron.
root #
crontab -e
Il comando sopra dovrebbe aprire il crontab dell'utente con un editor di testo. Per esempio, se emerge --sync è impostato per essere eseguito ogni giorno alle ore 6:30 A.M., editare il crontab in maniera simile a questa:
22 2 * * 1 /usr/bin/updatedb
30 6 * * * /usr/bin/emerge --sync
## (if using anacron, add this line)
30 7 * * * /usr/sbin/anacron -s
Verificare nuovamente la lista di lavori cron come fatto nell'esempio precedente per assicurarsi che i lavori siano programmati. Se ci sono tutti allora il sistema è pronto.
Utilizzare cronbase
Come già detto, tutti i pacchetti disponibili di cron dipendono da sys-process/cronbase. Il pacchetto cronbase crea /etc/cron.{hourly,daily,weekly,monthly}, e uno script chiamato run-crons. Notare che il file /etc/crontab contiene qualcosa simile a questo:
*/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
Per evitare di trattare troppi dettagli, assumere che tali comandi eseguiranno gli scripts ogni giorno, ogni ora, ogni settimana e ogni mese. Tale metodo di programmare i lavori cron ha qualche vantaggio importante:
- Essi verranno eseguiti anche se il computer è spento, se sono programmati per essere eseguiti;
- E 'facile per i manutentori dei pacchetti inserire gli script in quelle posizioni ben definite;
- Gli amministratori sanno esattamente dove sono memorizzati i lavori cron e crontab, così che diventa facile fare il backup e il restore di tali parti del loro sistema.
E' utile far notare che vixie-cron, cronie e bcron leggono automaticamente /etc/crontab, mentre dcron e fcron non lo fanno. Per maggiori informazioni in merito leggere la sezione System crontab.
Utilizzare anacron
Come già detto, anacron è utilizzato in sistemi non studiati per essere continuamente in funzione (come la maggior parte delle installazioni desktop). Il suo file di configurazione di default, /etc/anacrontab, in genere è simile al seguente:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# format: period delay job-identifier command
1 5 cron.daily run-parts /etc/cron.daily
7 10 cron.weekly run-parts /etc/cron.weekly
30 15 cron.monthly run-parts /etc/cron.monthly
La principale differenza tra questo e gli altri crontab comuni è che con anacron non vi è alcuna data/ora fissa per la pianificazione del lavoro, ma solo il periodo entro il quale ogni lavoro deve essere eseguito. Quando anacron è avviato, esso verificherà il contenuto di un set di files in /var/spool/anacron e calcola se la voce corrispondente nel file di configurazione è scaduta dopo l'ultima esecuzione. Se lo è, il comando viene invocato nuovamente.
Come nota finale, è importante commentare ogni voce di sovrapposizione in ogni cron installato sul sistema, come nel seguente esempio di vixie-cron:
# per vixie-cron
# $Header: /var/cvsroot/gentoo-x86/sys-process/vixie-cron/files/crontab-3.0.1-r4,v 1.3 2011/09/20 15:13:51 idl0r Exp $
# Variabili globali
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# controlla gli script cron.hourly, cron.daily, cron.weekly e cron.monthly
59 * * * * root rm -f /var/spool/cron/lastrun/cron.hourly
#9 3 * * * root rm -f /var/spool/cron/lastrun/cron.daily
#19 4 * * 6 root rm -f /var/spool/cron/lastrun/cron.weekly
#29 5 1 * * root rm -f /var/spool/cron/lastrun/cron.monthly
#*/10 * * * * root test -x /usr/sbin/run-crons && /usr/sbin/run-crons
@hourly root test ! -e /var/spool/cron/lastrun/cron.hourly && touch /var/spool/cron/lastrun/cron.hourly && run-parts --report /etc/cron.hourly
- Global variables
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/
- check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly
59 * * * * root rm -f /var/spool/cron/lastrun/cron.hourly
- 9 3 * * * root rm -f /var/spool/cron/lastrun/cron.daily
- 19 4 * * 6 root rm -f /var/spool/cron/lastrun/cron.weekly
- 29 5 1 * * root rm -f /var/spool/cron/lastrun/cron.monthly
- /10 * * * * root test -x /usr/sbin/run-crons && /usr/sbin/run-crons
@hourly root test ! -e /var/spool/cron/lastrun/cron.hourly && touch /var/spool/cron/lastrun/cron.hourly && run-parts --report /etc/cron.hourly }}
Senza fare questo, i lavori giornalieri, settimanali e mensili verranno eseguiti - in tempi differenti - sia dal demone cron che anacron, portando a possibili doppie esecuzioni di lavori.
Risoluzione di problemi
In caso di problemi con i lavori di cron, questa breve checklist può essere utile.
Ricordare, ogni pacchetto cron è differente è il range di caratteristiche varia notevolmente. Consultare il manuale di crontab, fcrontab o anacrontab, in base a quale demone cron è stato attivato!
Cron è in esecuzione?
Per verificare se cron è in esecuzione, vedere se è evidenziato nella lista dei processi:
root #
ps ax | grep cron
'/var/spool/cron/crontabs' is not a directory
Ensure that the user is in the "cron" group. Remember to log out and log; in order for the group changes to take effect. If that did not work, ensure that the username is in /etc/cron.allow. And if that didn't work, set crontab to be suid root.
root #
chmod u+s /usr/bin/crontab
Cron sta lavorando?
Provare come segue:
* * * * * /bin/echo "foobar" >> /file_you_own
Quindi verificare se /file_you_own viene periodicamente modificato.
Il comando sta lavorando?
Come prima, ma forse reindirizzare anche l'output di errore standard:
* * * * * /bin/echo "foobar" >> /file_you_own 2>&1
Cron può eseguire il lavoro?
Per vedere gli errori verificare il log cron, in genere /var/log/cron.log oppure /var/log/messages.
Ci sono tutte le dead.letters?
Generalmente cron invia una mail quando c'è un problema; verificare le mail e vedere se è stato creato il file ~/dead.letter.
Perché i messaggi di cron non vengono inviati??
Per ricevere posta da cron, è necessario implementare una configurazione MTA valida. Questo è fornito da qualsiasi pacchetto di virtual/mta.
Se le mail di cron devono essere inviate solo localmente e non attraverso un server di posta completamente configurato, il sistema può usare le mail mbox (/var/spool/mail), abilitando il mbox useflag con il rispettivo pacchetto che fornisce l'MTA.
External resources
This page is based on a document formerly found on our main website gentoo.org.
The following people contributed to the original document: Eric Brown, Xavier Neys,
They are listed here because wiki history does not allow for any external attribution. If you edit the wiki article, please do not add yourself here; your contributions are recorded on each article's associated history page.